<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Pedro França</title>
        <link>https://pedroffeitosa.vercel.app.</link>
        <description>Software development blog</description>
        <lastBuildDate>Fri, 13 Nov 2026 02:35:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Pedro França</title>
            <url>https://pedroffeitosa.vercel.app./favicon.ico</url>
            <link>https://pedroffeitosa.vercel.app.</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[Introduction to Algorithm Analysis]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/algorithm-analysis-introduction</link>
            <guid>https://pedroffeitosa.vercel.app./articles/algorithm-analysis-introduction</guid>
            <pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Algorithm performance analysis is a fundamental step in the design of an algorithm. Given a computational problem, several solutions can be proposed, such as sorting algorithms like BubbleSort, MergeSort, and QuickSort. Understanding how these algorithms behave as the input size increases is essential for choosing the best solution in a given context.</p>
<img alt="Comparison of sorting algorithms" loading="lazy" width="790" height="461" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Falgorithm-analysis.86e042aa.png&amp;w=828&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Falgorithm-analysis.86e042aa.png&amp;w=1920&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Falgorithm-analysis.86e042aa.png&amp;w=1920&amp;q=75">
<h2>Empirical Analysis</h2>
<p>An empirical approach analyzes the performance of an algorithm by setting up a controlled environment and measuring the execution time. The graph shows the comparison of different sorting algorithms as a function of the input size.</p>
<pre class="language-c"><code class="language-c"><span class="token keyword">int</span> <span class="token function">multiplyRemainderByIntegerPart</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">,</span> <span class="token keyword">int</span> j<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">int</span> remainder <span class="token operator">=</span> i <span class="token operator">%</span> j<span class="token punctuation">;</span>
  <span class="token keyword">int</span> integerPart <span class="token operator">=</span> i <span class="token operator">/</span> j<span class="token punctuation">;</span>
  <span class="token keyword">return</span> remainder <span class="token operator">*</span> integerPart<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>The empirical approach is useful but has limitations, such as the high cost of implementation and dependence on the hardware. Therefore, <strong>asymptotic analysis</strong> is preferred, as it is independent of the hardware and covers a broader range of inputs.</p>
<h2>Asymptotic Analysis</h2>
<p>Asymptotic analysis focuses on the behavior of algorithms for large inputs. It is based on the assumption that the cost of primitive operations is constant (O(1)).</p>
<h3>Example: Algorithm with Constant Cost</h3>
<pre class="language-c"><code class="language-c"><span class="token keyword">int</span> <span class="token function">multiplyRemainderByIntegerPart</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">,</span> <span class="token keyword">int</span> j<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">int</span> remainder <span class="token operator">=</span> i <span class="token operator">%</span> j<span class="token punctuation">;</span>
  <span class="token keyword">int</span> integerPart <span class="token operator">=</span> i <span class="token operator">/</span> j<span class="token punctuation">;</span>
  <span class="token keyword">return</span> remainder <span class="token operator">*</span> integerPart<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>In this example, the execution time is constant, regardless of the input size. For more complex algorithms, such as search or sorting, the execution time may vary depending on the number of iterations or elements in the array.</p>
<h2>Worst Case</h2>
<p>When there are loops or conditionals, analyzing the worst case is important to ensure the algorithm behaves as expected in extreme scenarios.</p>
<pre class="language-c"><code class="language-c">public <span class="token keyword">static</span> boolean <span class="token function">contains</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> v<span class="token punctuation">,</span> <span class="token keyword">int</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> v<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>v<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> n<span class="token punctuation">)</span>
      <span class="token keyword">return</span> true<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> false<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>For algorithms that involve iteration or nested loops, the execution time may be linear or quadratic, depending on the number of elements and the depth of the loops.</p>
<p>Asymptotic analysis helps us simplify these functions to understand the behavior of algorithms with large inputs, representing them through notations like O(n), O(log n), or O(n²), making it easier to compare and choose the best solution.</p>
<hr>
<p>Algorithm analysis, both empirical and asymptotic, is essential to ensure the efficiency and performance of code, especially in scenarios involving large volumes of data or when performance is critical.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Algorithm Solving Techniques]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/algorithm-solving-techniques</link>
            <guid>https://pedroffeitosa.vercel.app./articles/algorithm-solving-techniques</guid>
            <pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>When faced with algorithmic problems, choosing the right strategy is as important as implementing the solution. Here are four fundamental techniques that serve as the foundation for most algorithmic solutions.</p>
<h2>1. Brute Force</h2>
<p>This technique explores all possible options to find a solution. While simple to implement, it's often inefficient.</p>
<h3>Example: Find a pair with a given sum</h3>
<pre class="language-js"><code class="language-js"><span class="token keyword">function</span> <span class="token function">hasPairWithSum</span><span class="token punctuation">(</span><span class="token parameter">arr<span class="token punctuation">,</span> sum</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> arr<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> j <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> arr<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> arr<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">===</span> sum<span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
  <span class="token keyword control-flow">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>2. Greedy Algorithms</h2>
<p>Greedy methods build a solution step by step, always choosing the local optimum. This works for problems where local choices lead to a global solution.</p>
<h3>Example: Coin Change (Greedy)</h3>
<p>Choose the largest coin possible at each step. This works for standard denominations but may fail in arbitrary systems.</p>
<h2>3. Divide and Conquer</h2>
<p>This technique splits the problem into smaller subproblems, solves them recursively, and combines the results.</p>
<h3>Example: Merge Sort</h3>
<pre class="language-js"><code class="language-js"><span class="token keyword">function</span> <span class="token function">mergeSort</span><span class="token punctuation">(</span><span class="token parameter">arr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token property-access">length</span> <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> arr<span class="token punctuation">;</span>
  <span class="token keyword">const</span> mid <span class="token operator">=</span> <span class="token known-class-name class-name">Math</span><span class="token punctuation">.</span><span class="token method function property-access">floor</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token property-access">length</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">const</span> left <span class="token operator">=</span> <span class="token function">mergeSort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token method function property-access">slice</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> mid<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">const</span> right <span class="token operator">=</span> <span class="token function">mergeSort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token method function property-access">slice</span><span class="token punctuation">(</span>mid<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword control-flow">return</span> <span class="token function">merge</span><span class="token punctuation">(</span>left<span class="token punctuation">,</span> right<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>4. Dynamic Programming (DP)</h2>
<p>DP solves problems by breaking them into overlapping subproblems and storing the results of subproblems to avoid redundant work.</p>
<h3>Example: Fibonacci with Memoization</h3>
<pre class="language-js"><code class="language-js"><span class="token keyword">function</span> <span class="token function">fib</span><span class="token punctuation">(</span><span class="token parameter">n<span class="token punctuation">,</span> memo <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>n <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> n<span class="token punctuation">;</span>
  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>memo<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> memo<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span>
  memo<span class="token punctuation">[</span>n<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">fib</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> memo<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">fib</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">,</span> memo<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword control-flow">return</span> memo<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>Final Thoughts</h2>
<p>Understanding these core techniques is essential for improving your problem-solving skills. Over time, you'll learn to recognize which strategy applies best to different problem types — and how to combine them for more complex scenarios.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Greedy Algorithms: Concepts and Applications]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/greedy-algorithms</link>
            <guid>https://pedroffeitosa.vercel.app./articles/greedy-algorithms</guid>
            <pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Greedy algorithms are a class of algorithms that make the locally optimal choice at each step with the hope of finding the global optimum. They are often used for optimization problems where a sequence of choices leads to an optimal solution.</p>
<hr>
<h2>How Greedy Algorithms Work</h2>
<p>A greedy algorithm follows this simple strategy:</p>
<ol>
<li>Make the best choice at the current step.</li>
<li>Move to the next step without revisiting previous decisions.</li>
<li>Repeat until the problem is solved.</li>
</ol>
<hr>
<h2>Characteristics of Greedy Algorithms</h2>
<ul>
<li><strong>Greedy Choice Property</strong>: A global optimum can be arrived at by choosing the local optimum.</li>
<li><strong>Optimal Substructure</strong>: A problem has an optimal substructure if an optimal solution can be built from optimal solutions of its subproblems.</li>
</ul>
<p>Not all problems have these properties. If they do, a greedy algorithm can be very efficient.</p>
<hr>
<h2>Example: Activity Selection</h2>
<p>Given <code>n</code> activities with start and end times, select the maximum number of activities that don't overlap.</p>
<pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token operator">*</span><span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">Activity</span> <span class="token punctuation">{</span>
  <span class="token keyword">int</span> start<span class="token punctuation">,</span> end<span class="token punctuation">;</span>

  <span class="token class-name">Activity</span><span class="token punctuation">(</span><span class="token keyword">int</span> start<span class="token punctuation">,</span> <span class="token keyword">int</span> end<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>start <span class="token operator">=</span> start<span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>end <span class="token operator">=</span> end<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">GreedyActivitySelector</span> <span class="token punctuation">{</span>
  <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Activity</span><span class="token punctuation">&gt;</span></span> activities <span class="token operator">=</span> <span class="token class-name">List</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span>
      <span class="token keyword">new</span> <span class="token class-name">Activity</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      <span class="token keyword">new</span> <span class="token class-name">Activity</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      <span class="token keyword">new</span> <span class="token class-name">Activity</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      <span class="token keyword">new</span> <span class="token class-name">Activity</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">)</span>
    <span class="token punctuation">)</span><span class="token punctuation">;</span>

    activities<span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token class-name">Comparator</span><span class="token punctuation">.</span><span class="token function">comparingInt</span><span class="token punctuation">(</span>a <span class="token operator">-&gt;</span> a<span class="token punctuation">.</span>end<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">int</span> lastEnd <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Activity</span> a <span class="token operator">:</span> activities<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>a<span class="token punctuation">.</span>start <span class="token operator">&gt;=</span> lastEnd<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Selected: "</span> <span class="token operator">+</span> a<span class="token punctuation">.</span>start <span class="token operator">+</span> <span class="token string">"-"</span> <span class="token operator">+</span> a<span class="token punctuation">.</span>end<span class="token punctuation">)</span><span class="token punctuation">;</span>
        lastEnd <span class="token operator">=</span> a<span class="token punctuation">.</span>end<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This is a classic example of greedy algorithm success.</p>
<hr>
<h2>Common Greedy Algorithm Problems</h2>
<ul>
<li>Activity Selection Problem</li>
<li>Fractional Knapsack Problem</li>
<li>Huffman Encoding</li>
<li>Prim’s and Kruskal’s algorithms (Minimum Spanning Tree)</li>
<li>Dijkstra’s algorithm (Shortest Path)</li>
</ul>
<hr>
<h2>When Greedy Fails</h2>
<p>Greedy algorithms do <strong>not</strong> always produce the optimal solution. The <strong>0/1 Knapsack Problem</strong> is one such case, where dynamic programming gives the correct answer, but greedy fails.</p>
<hr>
<p>Greedy algorithms offer simple, intuitive solutions with great performance for many problems. Understanding their limitations and identifying problems that fit their structure is key to using them effectively.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Dynamic Programming: Intro, Memoization, and Tabulation]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/intro-to-dynamic-programming</link>
            <guid>https://pedroffeitosa.vercel.app./articles/intro-to-dynamic-programming</guid>
            <pubDate>Mon, 10 Feb 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dynamic Programming (DP) is a method for solving complex problems by breaking them down into simpler subproblems and solving each of those only once. It is especially useful for optimization problems where the same subproblems appear repeatedly.</p>
<hr>
<h2>When to Use Dynamic Programming</h2>
<p>Dynamic Programming is ideal when:</p>
<ul>
<li>The problem can be divided into overlapping subproblems.</li>
<li>The problem has an optimal substructure (the optimal solution can be built from optimal solutions of subproblems).</li>
</ul>
<hr>
<h2>Memoization (Top-Down Approach)</h2>
<p>Memoization is an optimization technique where you store the results of expensive function calls and return the cached result when the same inputs occur again.</p>
<h3>Example: Fibonacci with Memoization</h3>
<pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Fibonacci</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Integer</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">&gt;</span></span> memo <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">fib</span><span class="token punctuation">(</span><span class="token keyword">int</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>n <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">return</span> n<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>memo<span class="token punctuation">.</span><span class="token function">containsKey</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> memo<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">int</span> result <span class="token operator">=</span> <span class="token function">fib</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">fib</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    memo<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> result<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This approach reduces the exponential time complexity of the naive recursive Fibonacci to linear time.</p>
<hr>
<h2>Tabulation (Bottom-Up Approach)</h2>
<p>Tabulation builds up the solution iteratively using a table (usually an array). It avoids recursion entirely.</p>
<h3>Example: Fibonacci with Tabulation</h3>
<pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">fib</span><span class="token punctuation">(</span><span class="token keyword">int</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>n <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">return</span> n<span class="token punctuation">;</span>
  <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> dp <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>n <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  dp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
  dp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> dp<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> dp<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> dp<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Tabulation is usually more efficient in terms of space and avoids the overhead of function calls.</p>
<hr>
<h2>Choosing Between Memoization and Tabulation</h2>
<ul>
<li>Use <strong>memoization</strong> if the recursive structure of the problem is intuitive and you prefer a top-down style.</li>
<li>Use <strong>tabulation</strong> if you want better performance and can write the solution in a bottom-up way.</li>
</ul>
<hr>
<h2>Common DP Problems</h2>
<ul>
<li>Fibonacci sequence</li>
<li>Longest Common Subsequence (LCS)</li>
<li>0/1 Knapsack Problem</li>
<li>Coin Change</li>
<li>Matrix Chain Multiplication</li>
<li>Edit Distance</li>
</ul>
<hr>
<p>Dynamic Programming is a key technique in algorithm design. Mastering both memoization and tabulation will significantly improve your ability to solve complex problems efficiently.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Introduction to Recursion]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/intro-to-recursion</link>
            <guid>https://pedroffeitosa.vercel.app./articles/intro-to-recursion</guid>
            <pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Recursion is a powerful programming technique in which a function calls itself to solve smaller instances of a problem. Understanding how and when to use recursion can simplify complex problems significantly.</p>
<hr>
<h2>What is Recursion?</h2>
<p>A recursive function is defined in terms of itself. Every recursive solution must have:</p>
<ul>
<li><strong>Base Case</strong> – A condition under which the function returns without calling itself.</li>
<li><strong>Recursive Case</strong> – The part where the function calls itself to solve a subproblem.</li>
</ul>
<hr>
<h2>Example: Factorial</h2>
<pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">factorial</span><span class="token punctuation">(</span><span class="token keyword">int</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>n <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> n <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> n <span class="token operator">*</span> <span class="token function">factorial</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>In this Java example, <code>factorial(5)</code> calls <code>factorial(4)</code>, which calls <code>factorial(3)</code>, and so on, until it reaches the base case.</p>
<hr>
<h2>Stack Behavior</h2>
<p>Recursion uses the <strong>call stack</strong>. Each function call is placed on the stack and waits until deeper calls return.</p>
<p>Poorly written recursive functions may cause <strong>stack overflow</strong> if the base case is missing or unreachable.</p>
<hr>
<h2>When to Use Recursion</h2>
<p>Recursion is ideal when:</p>
<ul>
<li>The problem can be divided into similar subproblems.</li>
<li>You’re working with hierarchical data (like trees).</li>
<li>Iterative solutions are complex or less readable.</li>
</ul>
<hr>
<h2>Common Recursive Problems</h2>
<ul>
<li><strong>Fibonacci sequence</strong></li>
<li><strong>Tree traversal</strong> (preorder, inorder, postorder)</li>
<li><strong>Backtracking</strong> problems (e.g., Sudoku, N-Queens)</li>
<li><strong>Divide and conquer</strong> algorithms (e.g., MergeSort, QuickSort)</li>
</ul>
<hr>
<h2>Example: Binary Search (Recursive)</h2>
<pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">binarySearch</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr<span class="token punctuation">,</span> <span class="token keyword">int</span> target<span class="token punctuation">,</span> <span class="token keyword">int</span> low<span class="token punctuation">,</span> <span class="token keyword">int</span> high<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>low <span class="token operator">&gt;</span> high<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token keyword">int</span> mid <span class="token operator">=</span> low <span class="token operator">+</span> <span class="token punctuation">(</span>high <span class="token operator">-</span> low<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>mid<span class="token punctuation">]</span> <span class="token operator">==</span> target<span class="token punctuation">)</span> <span class="token keyword">return</span> mid<span class="token punctuation">;</span>
  <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>mid<span class="token punctuation">]</span> <span class="token operator">&gt;</span> target<span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token function">binarySearch</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> target<span class="token punctuation">,</span> low<span class="token punctuation">,</span> mid <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">else</span>
    <span class="token keyword">return</span> <span class="token function">binarySearch</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> target<span class="token punctuation">,</span> mid <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> high<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This recursive binary search breaks the array into smaller pieces at each call.</p>
<hr>
<h2>Pros and Cons</h2>
<p><strong>Pros</strong>:</p>
<ul>
<li>Elegant and concise code.</li>
<li>Great for naturally recursive problems.</li>
</ul>
<p><strong>Cons</strong>:</p>
<ul>
<li>Risk of stack overflow.</li>
<li>Can be less efficient than iteration due to function call overhead.</li>
</ul>
<hr>
<p>Recursion is a core concept that every developer should master. Once you understand how it works and when it’s appropriate, it becomes a valuable tool in your problem-solving toolkit.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Mastering Logarithmic Time Complexity]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/mastering-logarithmic-complexity</link>
            <guid>https://pedroffeitosa.vercel.app./articles/mastering-logarithmic-complexity</guid>
            <pubDate>Mon, 25 Mar 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Logarithmic time complexity, denoted as <strong>O(log n)</strong>, represents algorithms that reduce the problem size drastically at each step. A classic example is <strong>binary search</strong>, where the input size is halved at every iteration.</p>
<h2>Binary Search Example</h2>
<pre class="language-js"><code class="language-js"><span class="token keyword">function</span> <span class="token function">binarySearch</span><span class="token punctuation">(</span><span class="token parameter">arr<span class="token punctuation">,</span> target</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">let</span> left <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> right <span class="token operator">=</span> arr<span class="token punctuation">.</span><span class="token property-access">length</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token keyword control-flow">while</span> <span class="token punctuation">(</span>left <span class="token operator">&lt;=</span> right<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> mid <span class="token operator">=</span> <span class="token known-class-name class-name">Math</span><span class="token punctuation">.</span><span class="token method function property-access">floor</span><span class="token punctuation">(</span><span class="token punctuation">(</span>left <span class="token operator">+</span> right<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>mid<span class="token punctuation">]</span> <span class="token operator">===</span> target<span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> mid<span class="token punctuation">;</span>
    <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>mid<span class="token punctuation">]</span> <span class="token operator">&lt;</span> target<span class="token punctuation">)</span> left <span class="token operator">=</span> mid <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token keyword control-flow">else</span> right <span class="token operator">=</span> mid <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword control-flow">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>At each step, the search space is divided by 2. This results in <strong>log₂(n)</strong> steps in the worst case, making it significantly faster than linear search for large datasets.</p>
<h2>When to Expect Logarithmic Complexity</h2>
<p>Algorithms that:</p>
<ul>
<li>Divide the problem space repeatedly</li>
<li>Work with sorted data or tree-like structures (e.g., binary search trees, heaps)</li>
<li>Use recursive halving strategies</li>
</ul>
<p>These typically fall under <strong>O(log n)</strong> time.</p>
<h2>Why It Matters</h2>
<p>Logarithmic algorithms scale extremely well. Even for large input sizes, the number of steps grows slowly. For example:</p>
<ul>
<li>n = 1,000 → log₂(n) ≈ 10</li>
<li>n = 1,000,000 → log₂(n) ≈ 20</li>
</ul>
<p>Understanding and identifying opportunities to use <strong>O(log n)</strong> algorithms is a major step toward writing highly efficient code.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Understanding Data Structures and Algorithms]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/understanding-dsa</link>
            <guid>https://pedroffeitosa.vercel.app./articles/understanding-dsa</guid>
            <pubDate>Thu, 03 Oct 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Data Structures and Algorithms (DSA) form the backbone of computer science and efficient software development. Understanding DSA helps developers write optimized, maintainable, and scalable programs.</p>
<hr>
<h2>What is a Data Structure?</h2>
<p>A <strong>data structure</strong> is a way of organizing and storing data so that it can be accessed and modified efficiently. Different types of data structures are suited for different kinds of applications.</p>
<h3>Common Types</h3>
<ul>
<li><strong>Array</strong> – A collection of elements stored in contiguous memory.</li>
<li><strong>Linked List</strong> – A linear collection of elements, where each element points to the next.</li>
<li><strong>Stack</strong> – A LIFO (Last-In-First-Out) structure.</li>
<li><strong>Queue</strong> – A FIFO (First-In-First-Out) structure.</li>
<li><strong>Hash Table</strong> – Stores key-value pairs and provides efficient lookup.</li>
<li><strong>Tree</strong> – A hierarchical structure with nodes.</li>
<li><strong>Graph</strong> – A collection of nodes connected by edges.</li>
</ul>
<p>Choosing the right data structure impacts both <strong>memory usage</strong> and <strong>execution time</strong>.</p>
<hr>
<h2>What is an Algorithm?</h2>
<p>An <strong>algorithm</strong> is a finite sequence of well-defined steps for solving a problem or performing a computation.</p>
<h3>Common Algorithm Categories</h3>
<ul>
<li><strong>Sorting</strong> – Organizing data (e.g., QuickSort, MergeSort)</li>
<li><strong>Searching</strong> – Finding items in a data structure (e.g., Binary Search)</li>
<li><strong>Graph Traversal</strong> – Navigating graph data (e.g., DFS, BFS)</li>
<li><strong>Dynamic Programming</strong> – Solving problems using memoization and recursion.</li>
<li><strong>Greedy Algorithms</strong> – Making locally optimal choices at each step.</li>
</ul>
<hr>
<h2>Relationship Between Data Structures and Algorithms</h2>
<p>The efficiency of an algorithm often depends on the underlying data structure. For example:</p>
<ul>
<li><strong>Binary Search</strong> requires a sorted array.</li>
<li><strong>Dijkstra’s Algorithm</strong> uses a priority queue (often implemented with a heap).</li>
<li><strong>DFS/BFS</strong> work with stacks or queues, respectively.</li>
</ul>
<p>The right combination of structure and algorithm ensures optimal performance.</p>
<hr>
<h2>Real-World Example</h2>
<pre class="language-java"><code class="language-java"><span class="token comment">// Using a HashMap to count word frequency</span>
<span class="token keyword">public</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">&gt;</span></span> <span class="token function">countWords</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> words<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">&gt;</span></span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">String</span> word <span class="token operator">:</span> words<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>word<span class="token punctuation">,</span> map<span class="token punctuation">.</span><span class="token function">getOrDefault</span><span class="token punctuation">(</span>word<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> map<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>In this Java example, a <strong>hash map</strong> is used to efficiently count word frequencies in an array—demonstrating how the choice of data structure directly affects algorithm performance.</p>
<hr>
<h2>Why Learn DSA?</h2>
<p>Understanding DSA enables developers to:</p>
<ul>
<li>Solve complex problems more efficiently.</li>
<li>Perform well in technical interviews.</li>
<li>Optimize code for speed and memory.</li>
<li>Understand the trade-offs of different solutions.</li>
</ul>
<p>Whether you’re working on a small app or a large-scale system, mastering DSA is a critical skill in software engineering.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
        <item>
            <title><![CDATA[Understanding Time Complexity Notation]]></title>
            <link>https://pedroffeitosa.vercel.app./articles/understanding-time-complexity</link>
            <guid>https://pedroffeitosa.vercel.app./articles/understanding-time-complexity</guid>
            <pubDate>Sun, 10 Mar 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Time complexity notation helps describe how the runtime of an algorithm changes as the input size grows. Instead of focusing on exact execution time, we use mathematical functions to compare performance at scale. The most common notations are <strong>Big-O</strong>, <strong>Big-Ω</strong>, and <strong>Big-Θ</strong>.</p>
<h2>Big-O Notation (O)</h2>
<p>Big-O describes the <strong>upper bound</strong> — the worst-case scenario. It gives us a way to guarantee that an algorithm won't perform worse than a certain threshold.</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">function</span> <span class="token function">linearSearch</span><span class="token punctuation">(</span><span class="token parameter">arr<span class="token punctuation">,</span> target</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> arr<span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> target<span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> i<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword control-flow">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>In the worst case, the target is at the end of the array or not present. The function runs through the entire array, so the time complexity is <strong>O(n)</strong>.</p>
<h2>Big-Ω Notation (Ω)</h2>
<p>Big-Ω gives us the <strong>lower bound</strong> — the best-case scenario. It tells us how well an algorithm can perform in ideal conditions.</p>
<p>Using the same <code>linearSearch</code> example, if the target is the first element, the loop ends immediately. In this case, the time complexity is <strong>Ω(1)</strong>, meaning it completes in constant time.</p>
<h2>Big-Θ Notation (Θ)</h2>
<p>Big-Θ describes the <strong>tight bound</strong> — when an algorithm's best and worst cases grow at the same rate. If an algorithm is always linear regardless of input conditions, we say it is <strong>Θ(n)</strong>.</p>
<p>This notation is less commonly used in isolation, but it’s helpful when you want a complete picture of an algorithm's growth.</p>
<h2>Why This Matters</h2>
<p>Time complexity helps you:</p>
<ul>
<li>Predict how an algorithm scales</li>
<li>Choose between alternative solutions</li>
<li>Spot inefficient code before performance becomes a problem</li>
</ul>
<p>Understanding how to apply these notations is a key skill in writing scalable, efficient software. When designing algorithms, always consider how performance changes as inputs grow — and aim to choose or design solutions with the best time complexity you can afford.</p>]]></content:encoded>
            <author>jppfeitosa@gmail.com (Pedro França)</author>
        </item>
    </channel>
</rss>