<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Piyush</title>
    <description>The latest articles on DEV Community by Piyush (@smrtdvlpr).</description>
    <link>https://dev.to/smrtdvlpr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1496445%2Fa3f57165-a25b-43fa-9398-a8c0b3060873.jpeg</url>
      <title>DEV Community: Piyush</title>
      <link>https://dev.to/smrtdvlpr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smrtdvlpr"/>
    <language>en</language>
    <item>
      <title>Today I gave a C++ backend interview. Here’s how it went.</title>
      <dc:creator>Piyush</dc:creator>
      <pubDate>Thu, 16 May 2024 12:57:45 +0000</pubDate>
      <link>https://dev.to/smrtdvlpr/today-i-gave-a-c-backend-interview-heres-how-it-went-4ide</link>
      <guid>https://dev.to/smrtdvlpr/today-i-gave-a-c-backend-interview-heres-how-it-went-4ide</guid>
      <description>&lt;p&gt;I was just told by the HR that this round will be C++ focused and will also focus on other technical concepts. So I prepared the following concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C++ Language&lt;/li&gt;
&lt;li&gt;Data Structures and Algorithms&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Computer Network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t have much time to prepare, but I relied on what I had already learned and building on top of that foundation. Here’s how I went about my preparation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;C++ Preparation:&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medium Article:&lt;/strong&gt; I found this &lt;a href="https://medium.com/@alexander.s.augenstein/how-i-passed-the-c-code-interview-in-3-weeks-a3e350214a01"&gt;amazing article on Medium&lt;/a&gt; which covered my weak topics. Interestingly, these weak topics are often the most frequently asked in interviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Github Notes:&lt;/strong&gt; Another great resource I went through was this &lt;a href="https://encelo.github.io/notes.html"&gt;notes published on github&lt;/a&gt;for C++. This covers all the essential concepts and also highlights good questions and tricky concepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;InterviewBit Questions:&lt;/strong&gt; To bolster my confidence, I reviewed the most commonly asked &lt;a href="https://www.interviewbit.com/cpp-interview-questions/"&gt;C++ questions on InterviewBit.&lt;/a&gt; These questions served as great refreshers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume Preparation:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Past projects&lt;/strong&gt; : I made sure to revise and go through my past projects, since they can be asked at any time during the interview.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer Network:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;For the Computer Networks section, I utilized resources from InterviewBit and GeeksforGeeks (GFG), focusing particularly on the topics I was less familiar with.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Interview
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Question 1: TCP vs UDP
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question&lt;/strong&gt; : Explain the difference between TCP and UDP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer&lt;/strong&gt; : TCP (Transmission Control Protocol) is connection-oriented, ensuring reliable and ordered delivery of data. UDP (User Datagram Protocol), on the other hand, is connectionless and does not guarantee delivery, making it faster but less reliable. Since TCP is lossless protocol it is slower than UDP. Example of TCP can be website data or Financial information received through FIX protocol, whereas UDP example can be a video call or media streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Question 2: TCP vs UDP Usage
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question&lt;/strong&gt; : Where would you prefer to use TCP, and where UDP?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer&lt;/strong&gt; : TCP is preferred for applications requiring reliable communication, such as web browsing (HTTP/HTTPS) and email (SMTP). UDP is suitable for real-time applications like video streaming and online gaming, where speed is crucial and occasional data loss is acceptable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Question 3: Finding Target Sum in Vector
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question&lt;/strong&gt; : Find a target sum in a vector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approach&lt;/strong&gt; : Initially, I used brute force, then optimised it with binary search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up&lt;/strong&gt; : The interviewer asked why instead of using the traditional method of calculating:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mid = (low + high)/2;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mid = low + (high-low)/2;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I explained that using the below approach will avoid the case of overflow.He also asked if &lt;code&gt;x/2&lt;/code&gt; is faster than &lt;code&gt;x &amp;gt;&amp;gt; 1&lt;/code&gt;. I answered bitshifting will be faster than dividing by 2. Then he corrected me, C++ optimizes these operations, so it doesn’t matter which one is used. Therefore, C++ by default uses bitshifting to divide here by 2. So I need not substitute /2 with &amp;gt;&amp;gt;1.&lt;/p&gt;

&lt;h4&gt;
  
  
  Question 4: Pass by Reference vs Pass by Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question&lt;/strong&gt; : Explain Pass by Reference vs Pass by Value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer&lt;/strong&gt; : Passing by reference avoids duplicating the data, improving performance. However, it risks unintended modifications to the original data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up&lt;/strong&gt; : To prevent unintended changes, the interviewer suggested using the &lt;code&gt;const&lt;/code&gt; keyword when passing arguments by reference.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Question 5: Copying uint8_t Variables
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task&lt;/strong&gt; : Create four &lt;code&gt;uint8_t&lt;/code&gt; variables with assigned integers and copy them into a &lt;code&gt;uint32_t&lt;/code&gt; variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approach&lt;/strong&gt; : I mentioned two options: using &lt;code&gt;memcpy&lt;/code&gt; and using bitwise operations (left shifting and ORing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up&lt;/strong&gt; : The interviewer instructed me to explore &lt;code&gt;memcpy&lt;/code&gt; on my own. While attempting this, I encountered an error: “invalid conversion of type”. We discussed why &lt;code&gt;cout&lt;/code&gt; doesn’t print &lt;code&gt;uint8_t&lt;/code&gt; as an integer and the peculiarities of &lt;code&gt;char*&lt;/code&gt; handling in &lt;code&gt;cout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Task&lt;/strong&gt; : Segregate the &lt;code&gt;uint32_t&lt;/code&gt; back into four &lt;code&gt;uint8_t&lt;/code&gt; variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Key Learnings&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The interview was a rigorous yet enlightening experience. It highlighted the importance of understanding both high-level concepts and low-level details in C++. Revising from various resources paid off, especially focusing on commonly asked questions and tricky concepts.&lt;/p&gt;

</description>
      <category>uncategorized</category>
      <category>datastructures</category>
      <category>interview</category>
      <category>performance</category>
    </item>
    <item>
      <title>How is Graph stored in Memory?</title>
      <dc:creator>Piyush</dc:creator>
      <pubDate>Tue, 14 May 2024 20:14:22 +0000</pubDate>
      <link>https://dev.to/smrtdvlpr/how-is-graph-stored-in-memory-3e5f</link>
      <guid>https://dev.to/smrtdvlpr/how-is-graph-stored-in-memory-3e5f</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9lzIHKiE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://smrtdvlpr.files.wordpress.com/2024/05/screenshot-2024-05-14-at-11.52.41-pm.png%3Fw%3D769" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9lzIHKiE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://smrtdvlpr.files.wordpress.com/2024/05/screenshot-2024-05-14-at-11.52.41-pm.png%3Fw%3D769" alt="" width="769" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Graphs are fundamental data structures used to model relationships between entities in various fields such as computer science, social networks, transportation systems, and more. When working with graphs in computer programs, one of the key challenges is storing them efficiently in memory.&lt;/p&gt;

&lt;p&gt;Here in this article we will talk about storing graph in different data structures and their efficiency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding Graph Representation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At its core, a graph comprises vertices (nodes) and edges. These edges can be directed or undirected and may have weights associated with them. The choice of representation depends on the characteristics of the graph and the operations to be performed.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Data Structures for Graph Storage&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Adjacency Matrix
&lt;/h3&gt;

&lt;p&gt;This is a 2D array where each cell represents the presence or absence of an edge between two vertices. While suitable for dense graphs, adjacency matrices consume more memory, especially for sparse graphs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Representation:&lt;/strong&gt;  An adjacency matrix is a 2D array where each cell matrix[i][j]matrix[&lt;em&gt;i&lt;/em&gt;][&lt;em&gt;j&lt;/em&gt;] represents the presence or absence of an edge between vertex i and vertex j. For weighted graphs, the cell may contain the weight of the edge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 Adjacency Matrix:

 0 1 1 0 0 
 1 0 1 1 0 
 1 1 0 0 1 
 0 1 0 0 0 
 0 0 1 0 0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this matrix, Rows and columns represent vertices. A value of 1 indicates the presence of an edge between two vertices.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
     0 1 2 3 4
   +--------------
 0 | 0 1 1 0 0
 1 | 1 0 1 1 0
 2 | 1 1 0 0 1
 3 | 0 1 0 0 0
 4 | 0 0 1 0 0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row and column corresponds to a vertex, and the presence of an edge is indicated by a 1 in the corresponding cell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge Existence Check:&lt;/strong&gt; O(1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Addition/Removal:&lt;/strong&gt; O(1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space Complexity:&lt;/strong&gt; O(V2), where V is the number of vertices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Complexity for Traversal:&lt;/strong&gt; O(V2)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast edge existence check and edge addition/removal.&lt;/li&gt;
&lt;li&gt;Suitable for dense graphs with a large number of edges.&lt;/li&gt;
&lt;li&gt;Easy implementation and intuitive for small graphs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High memory consumption, especially for sparse graphs.&lt;/li&gt;
&lt;li&gt;Inefficient for graphs with many isolated vertices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Adjacency List
&lt;/h3&gt;

&lt;p&gt;Each vertex is associated with a list of its neighboring vertices. This approach is memory-efficient for sparse graphs as it only stores existing edges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 Adjacency List:

 0: 1 2
 1: 0 2 3
 2: 0 1 4
 3: 1
 4: 2

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Representation:&lt;/strong&gt;  An adjacency list is a collection of lists, where each vertex maintains a list of its neighboring vertices. Each line represents a vertex. The numbers after the colon denote the neighboring vertices of the vertex. For example, vertex 0 has neighbors 1 and 2, vertex 1 has neighbors 0, 2, and 3, and so on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge Existence Check:&lt;/strong&gt;  O(degree(v))&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Addition/Removal:&lt;/strong&gt;  O(1) if self-loops are allowed, O(degree(v)) otherwise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space Complexity:&lt;/strong&gt;  O(V+E), where Vis the number of vertices and E is the number of edges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Complexity for Traversal:&lt;/strong&gt;  O(V+E)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory-efficient for sparse graphs.&lt;/li&gt;
&lt;li&gt;Suitable for graphs with varying degrees of connectivity.&lt;/li&gt;
&lt;li&gt;Efficient for traversals and graph algorithms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slower edge existence check compared to adjacency matrix for dense graphs.&lt;/li&gt;
&lt;li&gt;Requires more memory overhead for storing pointers/references.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Edge List
&lt;/h3&gt;

&lt;p&gt;A simple list of all the edges in the graph, with each edge represented by a pair of vertices. Edge lists are memory-efficient for sparse graphs but may be less efficient for certain operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Representation:&lt;/strong&gt;  An edge list is a simple list containing all edges in the graph, each represented by a pair of vertices. Each pair of numbers represents an edge between two vertices. For example, (0, 1) indicates an edge between vertex 0 and vertex 1, and so on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 Edge List:
 (0, 1) (0, 2) (1, 2) (1, 3) (2, 4)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge Existence Check:&lt;/strong&gt; O(E)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Addition/Removal:&lt;/strong&gt; O(1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space Complexity:&lt;/strong&gt; O(E), where E is the number of edges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Complexity for Traversal:&lt;/strong&gt; O(E)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory-efficient for sparse graphs.&lt;/li&gt;
&lt;li&gt;Easy to implement and understand.&lt;/li&gt;
&lt;li&gt;Suitable for certain graph algorithms like Kruskal’s algorithm for minimum spanning trees.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slower edge existence check compared to adjacency matrix and adjacency list.&lt;/li&gt;
&lt;li&gt;Inefficient for certain operations like finding all neighbors of a vertex.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Adjacency Set
&lt;/h3&gt;

&lt;p&gt;Similar to the adjacency list, but it uses sets to store neighboring vertices. This can offer faster edge presence checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Representation:&lt;/strong&gt;  An adjacency set is similar to the adjacency list, but it uses sets instead of lists to store neighboring vertices. In an adjacency list, each vertex maintains a list (or other suitable data structure) of its neighboring vertices directly. However, in an adjacency set representation, each vertex maintains a set (often implemented using a hash set or a balanced binary search tree) of its neighboring vertices. The use of a set ensures that duplicate edges are not stored and allows for efficient edge presence checks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Adjacency Set:
0: {1, 2}
1: {0, 2, 3}
2: {0, 1, 4}
3: {1}
4: {2}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge Existence Check:&lt;/strong&gt; O(log⁡(degree(v)))&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Addition/Removal:&lt;/strong&gt; O(log⁡(degree(v)))&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space Complexity:&lt;/strong&gt; O(V+E), where V is the number of vertices and E is the number of edges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Complexity for Traversal:&lt;/strong&gt; O(V+E)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast edge existence check and edge addition/removal.&lt;/li&gt;
&lt;li&gt;Memory-efficient for sparse graphs.&lt;/li&gt;
&lt;li&gt;Suitable for graphs with varying degrees of connectivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slightly slower performance compared to adjacency list due to overhead of set operations.&lt;/li&gt;
&lt;li&gt;Requires additional memory overhead for storing sets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choosing the Right Data Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The choice of data structure depends on factors such as graph size, density, memory constraints, and the operations to be performed. For example, adjacency matrices are suitable for dense graphs with frequent edge operations, while adjacency lists are preferable for sparse graphs with memory constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Comparison&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Comparing the performance of different data structures for common graph operations reveals trade-offs. While adjacency matrices offer fast edge operations, they consume more memory. Adjacency lists, on the other hand, are  &lt;strong&gt;memory-efficient&lt;/strong&gt;  but may have  &lt;strong&gt;slower edge operations&lt;/strong&gt;  for dense graphs.&lt;/p&gt;

&lt;p&gt;By understanding the characteristics of different data structures and their trade-offs, we developers can make informed decisions when choosing the right representation for their graphs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.instagram.com/smrtdvlpr"&gt;For more info: follow me on instagram @smrtdvlpr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you enjoyed reading this &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sdPsxGXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sdPsxGXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>uncategorized</category>
      <category>datastructures</category>
      <category>graph</category>
      <category>memory</category>
    </item>
  </channel>
</rss>
