Ternary representation of Cantor set - GeeksforGeeks

01 Feb, 2022
Given three integers A, B and L, the task is to print the ternary cantor set from range [A, B] upto L levels. Ternary Cantor Set: A ternary Cantor set is a set built by removing the middle part of a line segment when divided into 3 parts and repeating this process with the remaining shorter segments. Below is an illustration of a cantor set.  
An illustration of a Ternary Cantor Set
Examples:  
Input: A = 0, B = 1, L = 2 Output: Level 0: [0.000000] — [1.000000] Level 1: [0.000000] — [0.333333] [0.666667] — [1.000000] Level 2: [0.000000] — [0.111111] [0.222222] — [0.333333] [0.666667] — [0.777778] [0.888889] — [1.000000] Explanation: For the given range [0, 1], in level 1, it is divided into three parts ([0, 0.33], [0.33, 0.67], [0.67, 1]). From the three parts, the middle part is ignored. This process is continued for every part in the subsequent executions.Input: A = 0, B = 9, L = 3 Output: Level_0: [0.000000] — [9.000000] Level_1: [0.000000] — [3.000000] [6.000000] — [9.000000] Level_2: [0.000000] — [1.000000] [2.000000] — [3.000000] [6.000000] — [7.000000] [8.000000] — [9.000000] Level_3: [0.000000] — [0.333333] [0.666667] — [1.000000] [2.000000] — [2.333333] [2.666667] — [3.000000] [6.000000] — [6.333333] [6.666667] — [7.000000] [8.000000] — [8.333333] [8.666667] — [9.000000]  
 
Approach: 
Create a linked list data structure for each node of the Set, having the start value, end value and a pointer to the next node.Initialize the list with the start and end value given as the input.For the next level: Create a new node where the difference between the start and end values is of the initial, i.e. start value is less than the initial end value.Further, modify the original node, such that the end value is more of the initial start value.Place the pointer to the new node after the original one accordingly
Create a linked list data structure for each node of the Set, having the start value, end value and a pointer to the next node.
Initialize the list with the start and end value given as the input.
For the next level: Create a new node where the difference between the start and end values is of the initial, i.e. start value is less than the initial end value.Further, modify the original node, such that the end value is more of the initial start value.Place the pointer to the new node after the original one accordingly
Create a new node where the difference between the start and end values is of the initial, i.e. start value is less than the initial end value.
Further, modify the original node, such that the end value is more of the initial start value.
Place the pointer to the new node after the original one accordingly
Below is the implementation of the above approach:  
C++
C
Java
C#
Javascript
// C++ implementation to find the cantor set// for n levels and// for a given start_num and end_num#include <bits/stdc++.h>using namespace std; // The Linked List Structure for the Cantor Settypedef struct cantor {    double start, end;    struct cantor* next;} Cantor; // Function to initialize the Cantor Set ListCantor* startList(Cantor* head,                double start_num,                double end_num){    if (head == NULL) {        head = new Cantor;        head->start = start_num;        head->end = end_num;        head->next = NULL;    }    return head;} // Function to propagate the list// by adding new nodes for the next levelsCantor* propagate(Cantor* head){    Cantor* temp = head;     if (temp != NULL) {        Cantor* newNode            = new Cantor;        double diff            = (((temp->end) - (temp->start)) / 3);         // Modifying the start and end values        // for the next level        newNode->end = temp->end;        temp->end = ((temp->start) + diff);        newNode->start = (newNode->end) - diff;         // Changing the pointers        // to the next node        newNode->next = temp->next;        temp->next = newNode;         // Recursively call the function        // to generate the Cantor Set        // for the entire level        propagate(temp->next->next);    }     return head;} // Function to print a level of the Setvoid print(Cantor* temp){    while (temp != NULL) {        printf("[%lf] -- [%lf]\t",            temp->start, temp->end);        temp = temp->next;    }    cout << endl;} // Function to build and display// the Cantor Set for each levelvoid buildCantorSet(int A, int B, int L){    Cantor* head = NULL;    head = startList(head, A, B);    for (int i = 0; i < L; i++) {        cout <<"Level_"<< i<<" : ";        print(head);        propagate(head);    }    cout <<"Level_"<< L<<" : ";    print(head);} // Driver codeint main(){    int A = 0;    int B = 9;    int L = 2;    buildCantorSet(A, B, L);     return 0;} // This code is contributed by shivanisingh
// C implementation to find the cantor set// for n levels and// for a given start_num and end_num #include <stdio.h>#include <stdlib.h>#include <string.h> // The Linked List Structure for the Cantor Settypedef struct cantor {    double start, end;    struct cantor* next;} Cantor; // Function to initialize the Cantor Set ListCantor* startList(Cantor* head,                  double start_num,                  double end_num){    if (head == NULL) {        head = (Cantor*)malloc(sizeof(Cantor));        head->start = start_num;        head->end = end_num;        head->next = NULL;    }    return head;} // Function to propagate the list// by adding new nodes for the next levelsCantor* propagate(Cantor* head){    Cantor* temp = head;     if (temp != NULL) {        Cantor* newNode            = (Cantor*)malloc(sizeof(Cantor));        double diff            = (((temp->end) - (temp->start)) / 3);         // Modifying the start and end values        // for the next level        newNode->end = temp->end;        temp->end = ((temp->start) + diff);        newNode->start = (newNode->end) - diff;         // Changing the pointers        // to the next node        newNode->next = temp->next;        temp->next = newNode;         // Recursively call the function        // to generate the Cantor Set        // for the entire level        propagate(temp->next->next);    }     return head;} // Function to print a level of the Setvoid print(Cantor* temp){    while (temp != NULL) {        printf("[%lf] -- [%lf]\t",               temp->start, temp->end);        temp = temp->next;    }    printf("\n");} // Function to build and display// the Cantor Set for each levelvoid buildCantorSet(int A, int B, int L){    Cantor* head = NULL;    head = startList(head, A, B);    for (int i = 0; i < L; i++) {        printf("Level_%d : ", i);        print(head);        propagate(head);    }    printf("Level_%d : ", L);    print(head);} // Driver codeint main(){    int A = 0;    int B = 9;    int L = 2;    buildCantorSet(A, B, L);     return 0;}
// Java implementation to find the cantor set// for n levels and// for a given start_num and end_num class GFG{     // The Linked List Structure for the Cantor Set    static class Cantor    {        double start, end;        Cantor next;    };     static Cantor Cantor;     // Function to initialize the Cantor Set List    static Cantor startList(Cantor head, double start_num,                            double end_num)    {        if (head == null)        {            head = new Cantor();            head.start = start_num;            head.end = end_num;            head.next = null;        }        return head;    }     // Function to propagate the list    // by adding new nodes for the next levels    static Cantor propagate(Cantor head)    {        Cantor temp = head;         if (temp != null)        {            Cantor newNode = new Cantor();            double diff = (((temp.end) - (temp.start)) / 3);             // Modifying the start and end values            // for the next level            newNode.end = temp.end;            temp.end = ((temp.start) + diff);            newNode.start = (newNode.end) - diff;             // Changing the pointers            // to the next node            newNode.next = temp.next;            temp.next = newNode;             // Recursively call the function            // to generate the Cantor Set            // for the entire level            propagate(temp.next.next);        }         return head;    }     // Function to print a level of the Set    static void print(Cantor temp)    {        while (temp != null)        {            System.out.printf("[%f] -- [%f]", temp.start, temp.end);            temp = temp.next;        }        System.out.printf("\n");    }     // Function to build and display    // the Cantor Set for each level    static void buildCantorSet(int A, int B, int L)    {        Cantor head = null;        head = startList(head, A, B);        for (int i = 0; i < L; i++)        {            System.out.printf("Level_%d : ", i);            print(head);            propagate(head);        }        System.out.printf("Level_%d : ", L);        print(head);    }     // Driver code    public static void main(String[] args)    {        int A = 0;        int B = 9;        int L = 2;        buildCantorSet(A, B, L);    }} // This code is contributed by Rajput-Ji
// C# implementation to find the cantor set// for n levels and// for a given start_num and end_numusing System; class GFG{     // The Linked List Structure for the Cantor Set    class Cantor    {        public double start, end;        public Cantor next;    };     static Cantor cantor;     // Function to initialize the Cantor Set List    static Cantor startList(Cantor head, double start_num,                            double end_num)    {        if (head == null)        {            head = new Cantor();            head.start = start_num;            head.end = end_num;            head.next = null;        }        return head;    }     // Function to propagate the list    // by adding new nodes for the next levels    static Cantor propagate(Cantor head)    {        Cantor temp = head;         if (temp != null)        {            Cantor newNode = new Cantor();            double diff = (((temp.end) - (temp.start)) / 3);             // Modifying the start and end values            // for the next level            newNode.end = temp.end;            temp.end = ((temp.start) + diff);            newNode.start = (newNode.end) - diff;             // Changing the pointers            // to the next node            newNode.next = temp.next;            temp.next = newNode;             // Recursively call the function            // to generate the Cantor Set            // for the entire level            propagate(temp.next.next);        }         return head;    }     // Function to print a level of the Set    static void print(Cantor temp)    {        while (temp != null)        {            Console.Write("[{0:F6}] -- [{1:F6}]",                            temp.start, temp.end);            temp = temp.next;        }        Console.Write("\n");    }     // Function to build and display    // the Cantor Set for each level    static void buildCantorSet(int A, int B, int L)    {        Cantor head = null;        head = startList(head, A, B);        for (int i = 0; i < L; i++)        {            Console.Write("Level_{0} : ", i);            print(head);            propagate(head);        }        Console.Write("Level_{0} : ", L);        print(head);    }     // Driver code    public static void Main(String[] args)    {        int A = 0;        int B = 9;        int L = 2;        buildCantorSet(A, B, L);    }} // This code is contributed by Rajput-Ji
<script> // Javascript implementation to find the cantor set// for n levels and// for a given start_num and end_num// The Linked List Structure for the Cantor Setclass Cantor{    constructor()    {        this.start = 0;        this.end = 0;        this.next = null;    }}; var cantor = null; // Function to initialize the Cantor Set Listfunction startList(head, start_num, end_num){    if (head == null)    {        head = new Cantor();        head.start = start_num;        head.end = end_num;        head.next = null;    }    return head;}// Function to propagate the list// by adding new nodes for the next levelsfunction propagate(head){    var temp = head;     if (temp != null)    {        var newNode = new Cantor();        var diff = (((temp.end) - (temp.start)) / 3);        // Modifying the start and end values        // for the next level        newNode.end = temp.end;        temp.end = ((temp.start) + diff);        newNode.start = (newNode.end) - diff;        // Changing the pointers        // to the next node        newNode.next = temp.next;        temp.next = newNode;        // Recursively call the function        // to generate the Cantor Set        // for the entire level        propagate(temp.next.next);    }    return head;}// Function to print a level of the Setfunction print(temp){    while (temp != null)    {        document.write("["+temp.start.toFixed(6)+"] -- ["+        temp.end.toFixed(6)+"] ");        temp = temp.next;    }    document.write("<br>");}// Function to build and display// the Cantor Set for each levelfunction buildCantorSet(A, B, L){    var head = null;    head = startList(head, A, B);    for (var i = 0; i < L; i++)    {        document.write("Level_"+ i +" : ");        print(head);        propagate(head);    }    document.write("Level_"+ L +" : ");    print(head);}// Driver codevar A = 0;var B = 9;var L = 2;buildCantorSet(A, B, L);  </script>
References: Cantor Set Wikipedia Related Article: N-th term of George Cantor set of rational numbers 
Rajput-Ji
shivanisinghss2110
itsok
saurabh1990aror
Technical Scripter 2019
Linked List
Mathematical
Technical Scripter
Linked List
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Circular Linked List | Set 2 (Traversal)
Swap nodes in a linked list without swapping data
Program to implement Singly Linked List in C++ using class
Circular Singly Linked List | Insertion
Given a linked list which is sorted, how will you insert in sorted way
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7