2023-12-28 18:55:58 +01:00
<!doctype html>
< html lang = "en" dir = "ltr" class = "docs-wrapper plugin-docs plugin-id-algorithms docs-version-current docs-doc-page docs-doc-id-recursion/2023-08-17-pyramid-slide-down/naive" data-has-hydrated = "false" >
< head >
< meta charset = "UTF-8" >
2024-07-11 23:59:04 +02:00
< meta name = "generator" content = "Docusaurus v3.0.0" >
2023-12-28 18:55:58 +01:00
< title data-rh = "true" > Naïve solution | mf< / title > < meta data-rh = "true" name = "viewport" content = "width=device-width,initial-scale=1" > < meta data-rh = "true" name = "twitter:card" content = "summary_large_image" > < meta data-rh = "true" property = "og:url" content = "https://blog.mfocko.xyz/algorithms/recursion/pyramid-slide-down/naive/" > < meta data-rh = "true" property = "og:locale" content = "en" > < meta data-rh = "true" name = "docusaurus_locale" content = "en" > < meta data-rh = "true" name = "docsearch:language" content = "en" > < meta data-rh = "true" name = "docusaurus_version" content = "current" > < meta data-rh = "true" name = "docusaurus_tag" content = "docs-algorithms-current" > < meta data-rh = "true" name = "docsearch:version" content = "current" > < meta data-rh = "true" name = "docsearch:docusaurus_tag" content = "docs-algorithms-current" > < meta data-rh = "true" property = "og:title" content = "Naïve solution | mf" > < meta data-rh = "true" name = "description" content = "Naïve solution of the Pyramid Slide Down .
">< meta data-rh = "true" property = "og:description" content = "Naïve solution of the Pyramid Slide Down .
">< link data-rh = "true" rel = "icon" href = "/img/favicon.ico" > < link data-rh = "true" rel = "canonical" href = "https://blog.mfocko.xyz/algorithms/recursion/pyramid-slide-down/naive/" > < link data-rh = "true" rel = "alternate" href = "https://blog.mfocko.xyz/algorithms/recursion/pyramid-slide-down/naive/" hreflang = "en" > < link data-rh = "true" rel = "alternate" href = "https://blog.mfocko.xyz/algorithms/recursion/pyramid-slide-down/naive/" hreflang = "x-default" > < link data-rh = "true" rel = "preconnect" href = "https://0VXRFPR4QF-dsn.algolia.net" crossorigin = "anonymous" > < link rel = "search" type = "application/opensearchdescription+xml" title = "mf" href = "/opensearch.xml" >
< link rel = "alternate" type = "application/rss+xml" href = "/blog/rss.xml" title = "mf RSS Feed" >
< link rel = "alternate" type = "application/atom+xml" href = "/blog/atom.xml" title = "mf Atom Feed" >
< link rel = "alternate" type = "application/json" href = "/blog/feed.json" title = "mf JSON Feed" >
2024-07-11 23:59:04 +02:00
< link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css" integrity = "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM" crossorigin = "anonymous" > < link rel = "stylesheet" href = "/assets/css/styles.b9f07789.css" >
2024-07-20 23:53:38 +02:00
< script src = "/assets/js/runtime~main.fd7c060d.js" defer = "defer" > < / script >
< script src = "/assets/js/main.b2fc7d7d.js" defer = "defer" > < / script >
2023-12-28 18:55:58 +01:00
< / head >
< body class = "navigation-with-keyboard" >
2024-01-03 15:14:53 +01:00
< script > ! function ( ) { function t ( t ) { document . documentElement . setAttribute ( "data-theme" , t ) } var e = function ( ) { try { return new URLSearchParams ( window . location . search ) . get ( "docusaurus-theme" ) } catch ( t ) { } } ( ) || function ( ) { try { return localStorage . getItem ( "theme" ) } catch ( t ) { } } ( ) ; t ( null !== e ? e : "light" ) } ( ) , function ( ) { try { const c = new URLSearchParams ( window . location . search ) . entries ( ) ; for ( var [ t , e ] of c ) if ( t . startsWith ( "docusaurus-data-" ) ) { var a = t . replace ( "docusaurus-data-" , "data-" ) ; document . documentElement . setAttribute ( a , e ) } } catch ( t ) { } } ( ) < / script > < div id = "__docusaurus" > < div role = "region" aria-label = "Skip to main content" > < a class = "skipToContent_fXgn" href = "#__docusaurus_skipToContent_fallback" > Skip to main content< / a > < / div > < nav aria-label = "Main" class = "navbar navbar--fixed-top" > < div class = "navbar__inner" > < div class = "navbar__items" > < button aria-label = "Toggle navigation bar" aria-expanded = "false" class = "navbar__toggle clean-btn" type = "button" > < svg width = "30" height = "30" viewBox = "0 0 30 30" aria-hidden = "true" > < path stroke = "currentColor" stroke-linecap = "round" stroke-miterlimit = "10" stroke-width = "2" d = "M4 7h22M4 15h22M4 23h22" > < / path > < / svg > < / button > < a class = "navbar__brand" href = "/" > < b class = "navbar__title text--truncate" > mf< / b > < / a > < div class = "navbar__item dropdown dropdown--hoverable" > < a href = "#" aria-haspopup = "true" aria-expanded = "false" role = "button" class = "navbar__link" > Additional FI MU materials< / a > < ul class = "dropdown__menu" > < li > < a aria-current = "page" class = "dropdown__link dropdown__link--active" href = "/algorithms/" > Algorithms< / a > < / li > < li > < a class = "dropdown__link" href = "/c/" > C< / a > < / li > < li > < a class = "dropdown__link" href = "/cpp/" > C++< / a > < / li > < / ul > < / div > < a class = "navbar__item navbar__link" href = "/contributions/" > Contributions< / a > < a class = "navbar__item navbar__link" href = "/talks/" > Talks< / a > < / div > < div class = "navbar__items navbar__items--right" > < a class = "navbar__item navbar__link" href = "/blog/" > Blog< / a > < div class = "toggle_vylO colorModeToggle_DEke" > < button class = "clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type = "button" disabled = "" title = "Switch between dark and light mode (currently light mode)" aria-label = "Switch between dark and light mode (currently light mode)" aria-live = "polite" > < svg viewBox = "0 0 24 24" width = "24" height = "24" class = "lightToggleIcon_pyhR" > < path fill = "currentColor" d = "M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z" > < / path > < / svg > < svg viewBox = "0 0 24 24" width = "24" height = "24" class = "darkToggleIcon_wfgR" > < path fill = "currentColor" d = "M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z" > < / path > < / svg > < / button > < / div > < div class = "navbarSearchContainer_Bca1" > < button type = "button" class = "DocSearch DocSearch-Button" aria-label = "Search" > < span class = "DocSearch-Button-Container" > < svg width = "20" height = "20" class = "DocSearch-Search-Icon" viewBox = "0 0 20 20" > < path d = "M14.386 14 . 386l4 . 0877 4 . 0877-4 . 0877-4 . 0877c-2 .
2023-12-28 18:55:58 +01:00
the one with maximum sum.< / p >
2024-02-04 13:54:29 +01:00
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > public< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > static< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > row< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > col< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > if< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > row < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > > =< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > length < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ||< / span > < span class = "token plain" > col < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > < < / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 0< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ||< / span > < span class = "token plain" > col < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > > =< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token plain" > row< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > length< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > // BASE: We have gotten out of bounds, there' s no reasonable value to< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > // return, so we just return the ‹ MIN_VALUE› to ensure that it cannot< / span > < span class = "toke
2023-12-28 18:55:58 +01:00
< p > As you can see, we have 2 overloads:< / p >
2024-02-04 13:54:29 +01:00
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > row< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > col< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-12-28 18:55:58 +01:00
< p > First one is used as a < em > public interface< / em > to the solution, you just pass in the
pyramid itself. Second one is the recursive “algorithm” that finds the slide
down.< / p >
< p > It is a relatively simple solution… There' s nothing to do at the bottom of the
pyramid, so we just return the value in the < em > cell< / em > . Otherwise we add it and try
to slide down the available cells below the current row.< / p >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "time-complexity" > Time complexity< a href = "#time-complexity" class = "hash-link" aria-label = "Direct link to Time complexity" title = "Direct link to Time complexity" > < / a > < / h2 >
< p > If you get the source code and run it yourself, it runs rather fine… I hope you
are wondering about the time complexity of the proposed solution and, since it
really is a naïve solution, the time complexity is pretty bad. Let' s find the
worst case scenario.< / p >
< p > Let' s start with the first overload:< / p >
2024-02-04 13:54:29 +01:00
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > public< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > static< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > return< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 0< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 0< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-12-28 18:55:58 +01:00
< p > There' s not much to do here, so we can safely say that the time complexity of
this function is bounded by < span class = "katex" > < span class = "katex-mathml" > < math xmlns = "http://www.w3.org/1998/Math/MathML" > < semantics > < mrow > < mi > T< / mi > < mo stretchy = "false" > (< / mo > < mi > n< / mi > < mo stretchy = "false" > )< / mo > < / mrow > < annotation encoding = "application/x-tex" > T(n)< / annotation > < / semantics > < / math > < / span > < span class = "katex-html" aria-hidden = "true" > < span class = "base" > < span class = "strut" style = "height:1em;vertical-align:-0.25em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < span class = "mopen" > (< / span > < span class = "mord mathnormal" > n< / span > < span class = "mclose" > )< / span > < / span > < / span > < / span > , where < span class = "katex" > < span class = "katex-mathml" > < math xmlns = "http://www.w3.org/1998/Math/MathML" > < semantics > < mrow > < mi > T< / mi > < / mrow > < annotation encoding = "application/x-tex" > T< / annotation > < / semantics > < / math > < / span > < span class = "katex-html" aria-hidden = "true" > < span class = "base" > < span class = "strut" style = "height:0.6833em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < / span > < / span > < / span > is our second overload. This
doesn' t tell us anything, so let' s move on to the second overload where we are
going to define the < span class = "katex" > < span class = "katex-mathml" > < math xmlns = "http://www.w3.org/1998/Math/MathML" > < semantics > < mrow > < mi > T< / mi > < mo stretchy = "false" > (< / mo > < mi > n< / mi > < mo stretchy = "false" > )< / mo > < / mrow > < annotation encoding = "application/x-tex" > T(n)< / annotation > < / semantics > < / math > < / span > < span class = "katex-html" aria-hidden = "true" > < span class = "base" > < span class = "strut" style = "height:1em;vertical-align:-0.25em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < span class = "mopen" > (< / span > < span class = "mord mathnormal" > n< / span > < span class = "mclose" > )< / span > < / span > < / span > < / span > function.< / p >
2024-02-04 13:54:29 +01:00
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > public< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > static< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > longestSlideDown< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > row< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > col< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > if< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > row < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > > =< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > length < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ||< / span > < span class = "token plain" > col < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > < < / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 0< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ||< / span > < span class = "token plain" > col < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > > =< / span > < span class = "token plain" > pyramid< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token plain" > row< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > length< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > // BASE: We have gotten out of bounds, there' s no reasonable value to< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > // return, so we just return the ‹ MIN_VALUE› to ensure that it cannot< / span > < span class = "toke
2023-12-28 18:55:58 +01:00
< p > Fun fact is that the whole “algorithm” consists of just 2 < code > return< / code > statements
and nothing else. Let' s dissect them!< / p >
< p > First < code > return< / code > statement is the base case, so it has a constant time complexity.< / p >
< p > Second one a bit tricky. We add two numbers together, which we' ll consider as
constant, but for the right part of the expression we take maximum from the left
and right paths. OK… So what happens? We evaluate the < code > longestSlideDown< / code > while
choosing the under and right both. They are separate computations though, so we
are branching from each call of < code > longestSlideDown< / code > , unless it' s a base case.< / p >
< p > What does that mean for us then? We basically get< / p >
< span class = "katex-display" > < span class = "katex" > < span class = "katex-mathml" > < math xmlns = "http://www.w3.org/1998/Math/MathML" display = "block" > < semantics > < mrow > < mi > T< / mi > < mo stretchy = "false" > (< / mo > < mi > y< / mi > < mo stretchy = "false" > )< / mo > < mo > =< / mo > < mrow > < mo fence = "true" > {< / mo > < mtable rowspacing = "0.36em" columnalign = "left left" columnspacing = "1em" > < mtr > < mtd > < mstyle scriptlevel = "0" displaystyle = "false" > < mn > 1< / mn > < / mstyle > < / mtd > < mtd > < mstyle scriptlevel = "0" displaystyle = "false" > < mrow > < mtext > , if < / mtext > < mi > y< / mi > < mo > =< / mo > < mi > r< / mi > < mi > o< / mi > < mi > w< / mi > < mi > s< / mi > < / mrow > < / mstyle > < / mtd > < / mtr > < mtr > < mtd > < mstyle scriptlevel = "0" displaystyle = "false" > < mrow > < mn > 1< / mn > < mo > +< / mo > < mn > 2< / mn > < mo > ⋅< / mo > < mi > T< / mi > < mo stretchy = "false" > (< / mo > < mi > y< / mi > < mo > +< / mo > < mn > 1< / mn > < mo stretchy = "false" > )< / mo > < / mrow > < / mstyle > < / mtd > < mtd > < mstyle scriptlevel = "0" displaystyle = "false" > < mtext > , otherwise< / mtext > < / mstyle > < / mtd > < / mtr > < / mtable > < / mrow > < / mrow > < annotation encoding = "application/x-tex" > T(y) =
\begin{cases}
1 & \text{, if } y = rows \\
1 + 2 \cdot T(y + 1) & \text{, otherwise}
\end{cases}< / annotation > < / semantics > < / math > < / span > < span class = "katex-html" aria-hidden = "true" > < span class = "base" > < span class = "strut" style = "height:1em;vertical-align:-0.25em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < span class = "mopen" > (< / span > < span class = "mord mathnormal" style = "margin-right:0.03588em" > y< / span > < span class = "mclose" > )< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < span class = "mrel" > =< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < / span > < span class = "base" > < span class = "strut" style = "height:3em;vertical-align:-1.25em" > < / span > < span class = "minner" > < span class = "mopen delimcenter" style = "top:0em" > < span class = "delimsizing size4" > {< / span > < / span > < span class = "mord" > < span class = "mtable" > < span class = "col-align-l" > < span class = "vlist-t vlist-t2" > < span class = "vlist-r" > < span class = "vlist" style = "height:1.69em" > < span style = "top:-3.69em" > < span class = "pstrut" style = "height:3.008em" > < / span > < span class = "mord" > < span class = "mord" > 1< / span > < / span > < / span > < span style = "top:-2.25em" > < span class = "pstrut" style = "height:3.008em" > < / span > < span class = "mord" > < span class = "mord" > 1< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mbin" > +< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mord" > 2< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mbin" > ⋅< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < span class = "mopen" > (< / span > < span class = "mord mathnormal" style = "margin-right:0.03588em" > y< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mbin" > +< / span > < span class = "mspace" style = "margin-right:0.2222em" > < / span > < span class = "mord" > 1< / span > < span class = "mclose" > )< / span > < / span > < / span > < / span > < span class = "vlist-s" > < / span > < / span > < span class = "vlist-r" > < span class = "vlist" style = "height:1.19em" > < span > < / span > < / span > < / span > < / span > < / span > < span class = "arraycolsep" style = "width:1em" > < / span > < span class = "col-align-l" > < span class = "vlist-t vlist-t2" > < span class = "vlist-r" > < span class = "vlist" style = "height:1.69em" > < span style = "top:-3.69em" > < span class = "pstrut" style = "height:3.008em" > < / span > < span class = "mord" > < span class = "mord text" > < span class = "mord" > , if < / span > < / span > < span class = "mord mathnormal" style = "margin-right:0.03588em" > y< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < span class = "mrel" > =< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < span class = "mord mathnormal" > ro< / span > < span class = "mord mathnormal" style = "margin-right:0.02691em" > w< / span > < span class = "mord mathnormal" > s< / span > < / span > < / span > < span style = "top:-2.25em" > < span class = "pstrut" style = "height:3.008em" > < / span > < span class = "mord" > < span class = "mord text" > < span class = "mord" > , otherwise< / span > < / span > < / span > < / span > < / span > < span class = "vlist-s" > < / span > < / span > < span class = "vlist-r" > < span class = "vlist" style = "height:1.19em" > < span > < / span > < / span > < / span > < / span > < / span > < / span > < / span > < span class = "mclose nulldelimiter" > < / span > < / span > < / span > < / span > < / span > < / span >
< p > That looks rather easy to compute, isn' t it? If you sum it up, you' ll get:< / p >
< span class = "katex-display" > < span class = "katex" > < span class = "katex-mathml" > < math xmlns = "http://www.w3.org/1998/Math/MathML" display = "block" > < semantics > < mrow > < mi > T< / mi > < mo stretchy = "false" > (< / mo > < mi > r< / mi > < mi > o< / mi > < mi > w< / mi > < mi > s< / mi > < mo stretchy = "false" > )< / mo > < mo > ∈< / mo > < mi mathvariant = "script" > O< / mi > < mo stretchy = "false" > (< / mo > < msup > < mn > 2< / mn > < mrow > < mi > r< / mi > < mi > o< / mi > < mi > w< / mi > < mi > s< / mi > < / mrow > < / msup > < mo stretchy = "false" > )< / mo > < / mrow > < annotation encoding = "application/x-tex" > T(rows) \in \mathcal{O}(2^{rows})< / annotation > < / semantics > < / math > < / span > < span class = "katex-html" aria-hidden = "true" > < span class = "base" > < span class = "strut" style = "height:1em;vertical-align:-0.25em" > < / span > < span class = "mord mathnormal" style = "margin-right:0.13889em" > T< / span > < span class = "mopen" > (< / span > < span class = "mord mathnormal" > ro< / span > < span class = "mord mathnormal" style = "margin-right:0.02691em" > w< / span > < span class = "mord mathnormal" > s< / span > < span class = "mclose" > )< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < span class = "mrel" > ∈< / span > < span class = "mspace" style = "margin-right:0.2778em" > < / span > < / span > < span class = "base" > < span class = "strut" style = "height:1em;vertical-align:-0.25em" > < / span > < span class = "mord mathcal" style = "margin-right:0.02778em" > O< / span > < span class = "mopen" > (< / span > < span class = "mord" > < span class = "mord" > 2< / span > < span class = "msupsub" > < span class = "vlist-t" > < span class = "vlist-r" > < span class = "vlist" style = "height:0.7144em" > < span style = "top:-3.113em;margin-right:0.05em" > < span class = "pstrut" style = "height:2.7em" > < / span > < span class = "sizing reset-size6 size3 mtight" > < span class = "mord mtight" > < span class = "mord mathnormal mtight" > ro< / span > < span class = "mord mathnormal mtight" style = "margin-right:0.02691em" > w< / span > < span class = "mord mathnormal mtight" > s< / span > < / span > < / span > < / span > < / span > < / span > < / span > < / span > < / span > < span class = "mclose" > )< / span > < / span > < / span > < / span > < / span >
< p > If you wonder why, I' ll try to describe it intuitively:< / p >
< ol >
< li > In each call to < code > longestSlideDown< / code > we do some work in constant time,
regardless of being in the base case. Those are the < code > 1< / code > s in both cases.< / li >
< li > If we are not in the base case, we move one row down < strong > twice< / strong > . That' s how we
obtained < code > 2 *< / code > and < code > y + 1< / code > in the < em > otherwise< / em > case.< / li >
< li > We move row-by-row, so we move down < code > y< / code > -times and each call splits to two
subtrees.< / li >
< li > Overall, if we were to represent the calls as a tree, we would get a full
binary tree of height < code > y< / code > , in each node we do some work in constant time,
therefore we can just sum the ones.< / li >
< / ol >
2024-07-11 23:59:04 +02:00
< div class = "theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger" > < div class = "admonitionHeading_Gvgb" > < span class = "admonitionIcon_Rf37" > < svg viewBox = "0 0 12 16" > < path fill-rule = "evenodd" d = "M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z" > < / path > < / svg > < / span > danger< / div > < div class = "admonitionContent_BuS1" > < p > It would' ve been more complicated to get an exact result. In the equation above
2023-12-28 18:55:58 +01:00
we are assuming that the width of the pyramid is bound by the height.< / p > < / div > < / div >
2024-01-03 15:14:53 +01:00
< p > Hopefully we can agree that this is not the best we can do. <!-- --> 😉< / p > < / div > < footer class = "theme-doc-footer docusaurus-mt-lg" > < div class = "theme-doc-footer-tags-row row margin-bottom--sm" > < div class = "col" > < b > Tags:< / b > < ul class = "tags_jXut padding--none margin-left--sm" > < li class = "tag_QGVx" > < a class = "tag_zVej tagRegular_sFm0" href = "/algorithms/tags/java/" > java< / a > < / li > < li class = "tag_QGVx" > < a class = "tag_zVej tagRegular_sFm0" href = "/algorithms/tags/recursion/" > recursion< / a > < / li > < li class = "tag_QGVx" > < a class = "tag_zVej tagRegular_sFm0" href = "/algorithms/tags/exponential/" > exponential< / a > < / li > < / ul > < / div > < / div > < div class = "theme-doc-footer-edit-meta-row row" > < div class = "col" > < a href = "https://github.com/mfocko/blog/tree/main/algorithms/04-recursion/2023-08-17-pyramid-slide-down/01-naive.md" target = "_blank" rel = "noopener noreferrer" class = "theme-edit-this-page" > < svg fill = "currentColor" height = "20" width = "20" viewBox = "0 0 40 40" class = "iconEdit_Z9Sw" aria-hidden = "true" > < g > < path d = "m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z" > < / path > < / g > < / svg > Edit this page< / a > < / div > < div class = "col lastUpdated_vwxv" > < span class = "theme-last-updated" > Last updated<!-- --> on < b > < time datetime = "2023-08-17T00:00:00.000Z" > Aug 17, 2023< / time > < / b > < / span > < / div > < / div > < / footer > < / article > < nav class = "pagination-nav docusaurus-mt-lg" aria-label = "Docs pages" > < a class = "pagination-nav__link pagination-nav__link--prev" href = "/algorithms/recursion/pyramid-slide-down/" > < div class = "pagination-nav__sublabel" > Previous< / div > < div class = "pagination-nav__label" > Introduction to dynamic programming< / div > < / a > < a class = "pagination-nav__link pagination-nav__link--next" href = "/algorithms/recursion/pyramid-slide-down/greedy/" > < div class = "pagination-nav__sublabel" > Next< / div > < div class = "pagination-nav__label" > Greedy solution< / div > < / a > < / nav > < / div > < / div > < div class = "col col--3" > < div class = "tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop" > < ul class = "table-of-contents table-of-contents__left-border" > < li > < a href = "#time-complexity" class = "table-of-contents__link toc-highlight" > Time complexity< / a > < / li > < / ul > < / div > < / div > < / div > < / div > < / main > < / div > < / div > < / div > < footer class = "footer footer--dark" > < div class = "container container-fluid" > < div class = "row footer__links" > < div class = "col footer__col" > < div class = "footer__title" > Git< / div > < ul class = "footer__items clean-list" > < li class = "footer__item" > < a href = "https://github.com/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > GitHub< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li > < li class = "footer__item" > < a href = "https://gitlab.com/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > GitLab< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li > < li class = "footer__item" > < a href = "https://git.mfocko.xyz/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > Gitea (self-hosted)< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li > < / ul > < / div > < div class = "col footer__col" > < div class = "footer__title" > Social #1< / div > < ul class = "footer__items clean-list" > < li class = "footer__item" > < a href = "https://www.linkedin.com/in/mfocko/" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > LinkedIn< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h
2023-12-28 18:55:58 +01:00
< / body >
< / html >