DEV Community

Rafael Calpena
Rafael Calpena

Posted on

1 1

Math Concepts for Programming - Sets

Today, I'm starting a series of posts about object relationships. In this post, we are going to see a foundational concept in Mathematics called Set. Let's check some use case examples and operations that can be applied to them.

Sets are "The Building Blocks"

A set is a well-defined collection of distinct objects.

The objects that belong to a set are called its elements (or points or members)

Source: Functional Analysis by P. K. Jain, Khalil Ahmad, and Om P. Ahuja

An informal way of defining a Set is a container (box/circle) that has distinct objects inside. We can represent it with the following notation:

S = {1, 2, 'some string'}
  • The elements of the Set are written inside the curly braces. S is an identifier to the Set.

The order of the objects does not matter.

S = {1, 2, 3} = {2, 3, 1} = {3, 2, 1}
  • The definition of Set does not allow for repetition of the same element, so each element should be represented at most once.
S = {1, 1, 2, 3, 2, 3} = {1, 2, 3}

Uses

We can use Sets to define the world around us.

  • The set of states in a country.
States = {'New York', 'California', 'Florida', 'Washington DC', ...} // size = 50
  • The set of username ids who have used your website this week.
usersFromLastWeek = {12938, 89032, 55866}
  • The empty set.
S = {}

Sets can also represent more complex cases.

  • The set of natural numbers (infinite).
S = {1, 2, 3, 4, ...} // Size = Infinity
  • The set of sets mentioned above.
S = { 
    {'New York', 'California', 'Florida', 'Washington DC', ...},
    {12938, 89032, 55866},
    {}
} // Size = 3
  • Self-containing sets.
S = {1, 2, S} =
{
    1, 2,
    { // S
        1, 2, { // S
            1, 2, {...}
        }
    }
} // Size = 3

đź’ˇ Elements contained in nested Sets are not considered direct elements from the Root Set (S).

Properties

  • Size = Number of elements present in the Set.

Operations

Operations are ways to read and/or transform the Set into another Set (or another object):

đź’ˇ The notation below is pseudo-code

  • Is Empty to check if Set size equals zero.
S1 = {}
isEmpty(S1) // = true
S2 = {1, 2, 3}
isEmpty(S2) // = false
  • Add one or more elements to the Set.
S1 = {1, 2}; 
S2 = add(S1, 3, 10); // = {1, 2, 3, 10};
  • Remove one or more elements from the Set.
S1 = {'a', 'b', 'c', 'd'}; 
S2 = remove(S1, 'c') // = {'a', 'b', 'd'}
  • Has to check if an element is contained in the Set.
S1 = {'a', 'b', 'c', 'd'}; 
has(S1, 'e') // False
has(S1, 'a') // True
  • Iterate to loop over elements in the Set.
S1 = {'Sandra', 'Mary', 'Louis'};
for (let person of S1) {
    // person = Sandra, Mary and Louis, respectively
    // Order may vary
}
  • Equals for comparing if one Set contains the exact same elements as another Set.
S1 = {'first', 'second', 'third'}
S2 = {'second', 'third', 'first'} // Order does not matter
equals(S1, S2) // True
S3 = {'fourth'}
equals(S1, S3) // False
  • Union: Creates a resulting Set that contains all elements from both Sets.
S1 = {'first', 'second', 'third'}
S2 = {'fourth'}
union(S1, S2) // = {'first', 'second', 'third', 'fourth'}
  • Difference: Creates a resulting Set with elements in Set1 that are not contained in Set2.
S1 = {'first', 'second', 'third'}
S2 = {'second'}
difference(S1, S2) // = {'first', 'third'}
  • Intersection: Creates a resulting set that contains only elements both present in Set1 and Set2
S1 = {'first', 'second', 'third'}
S2 = {'second', 'fourth'}
intersection(S1, S2) // = {'second'}
  • Disjoint: 2 sets are disjoint if their intersection is equal to the empty set.
S1 = {1, 2, 3}
S2 = {4, 5, 6}
areDisjoint(S1, S2) // = True

S3 = {3, 9, 10}
areDisjoint(S1, S3) // = False, because of "3"
areDisjoint(S2, S3) // = True
  • Filter for getting a set of only the elements that satisfy a given condition. The elements that do not satisfy the condition are not part of the result.
S1 = {1, 2, 3, 4, 5, 6}
numberIsEven = (number) => number % 2 === 0;
S2 = filter(S1, numberIsEven) // = {2, 4, 6}
  • Map for mapping Set elements into other elements
S1 = {1, 2, 3, 4, 5}
S2 = map(S1, (number) => number * 9)) // = {9, 18, 27, 36, 45}
  • Reduce for iterating on the Set and creating a new result. It takes an accumulator and item and returns a new value for the accumulator.
S1 = {1, 2, 3, 4, 5}
reduce (S1, (count, element) => count + element, 0) // Sum all elements, = 15
  • Symmetric Difference for obtaining the elements that are in either of the Sets, but not in both of them.
S1 = {1, 2, 3, 4}
S2 = {2, 4, 5, 6}
S3 = symmetricDifference(S1, S2) // = {1, 3, 5, 6}
  • Is Superset For checking whether one Set contains all elements of the other Set.
S1 = {1, 2, 3, 4}
S2 = {1}
isSuperset(S1, S2) // = true
S3 = {3, 4}
isSuperset(S1, S3) // = true
S4 = {3, 4, 5}
isSuperset(S1, S4) // = false
  • is Subset For checking whether all elements of one Set are contained in another Set.
S1 = {1, 2, 3, 4}
S2 = {1}
isSubset(S2, S1) // = true
S3 = {3, 4}
isSubset(S3, S1) // = true
S4 = {3, 4, 5}
isSubset(S4, S1) // = false
  • Find: Used to find one element in the Set that satisfies some constraint.
S1 = {1, 2, 3, 4, 5}
element = find(S1, n => n > 3) // = 4 or 5 (order may vary)
  • Every: Check if all elements of the Set satisfy some constraint.
S1 = {1, 2, 3, 4, 5}
element = every(S1, n => n < 10) // = True

S1 = {1, 2, 3, 4, 5}
element = every(S1, n => n < 3) // = False, because of 4 and 5
  • Order two or more Sets by their sizes. Returns a tuple with size as the number of Sets provided.
S1 = {1, 2}
S2 = {0}
S3 = {4, 1, 2}

order(S1, S2) // (S2, S1, S3)
  • Changes: A way to compare 2 Sets and find which elements must be removed or added from the first set to become equal to the second set.
S1 = {1, 2, 3, 4, 5, 6}
S2 = {4, 5, 6, 7}
Changes(S1, S2) = ({1, 2, 3}, {7}) // Starting from S1, remove 1, 2 and 3, and add 7 to transform it to S2
  • Cartesian Product: Multiply two sets in order to create a set of ordered pairs
S1 = {'a', 'b', 'c'}
S2 = {0, 1}
S3 = cartesianProduct(S1, S2) // = { ('a', 0), ('a', 1), ('b', 0), ('b', 1), ('c', 0), ('c', 1) }

In the next post, we are going to take a deeper look at ordered pairs and its uses.

Bonus

Russell's Paradox - a.k.a. The Barber Paradox

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

đź‘‹ Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay