Ternary Cantor Set problem in C++
In this tutorial, we will learn about the Ternary Cantor Set problem in C++.
We will learn to write program code for Cantor Set. Firstly, let’s take a look at the Cantor Set. In maths, it is a pattern that is created by dividing a line segment into 3 equal halves and then removing the middle part of a line segment the process is repeated continuously with the remaining smaller line segments.
Illustration of a cantor set:
█████████████████████████████████████████████████████████████████████████████████ ███████████████████████████ ███████████████████████████ █████████ █████████ █████████ █████████ ███ ███ ███ ███ ███ ███ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
Secondly, let’s learn the approach to write the program
Steps to write a program:
STEPS1: For each node of the set, we will create a linked list data structure.
STEPS2: After this, we will initialize the start and end value of the list given as the input.
STEPS3: In this step, a new node is created in which we will initialize the starting value with 1/3rd less than the initial end value.
STPES4: Finally, we will modify the original node, and the end value is 1/3rd more of the initial start value.
Example:
Input: A = 0, B = 12, L = 3
Output:
Lvl_0: [0.000000] — [12.000000]
Lvl_1: [0.000000] — [4.000000] [8.000000] — [12.000000]
Lvl_2: [0.000000] — [1.333333] [2.666667] — [4.000000] [8.000000] — [9.333333] [10.666667] — [12.000000]
Lvl_3: [0.000000] — [0.444444] [0.888889] — [1.333333] [2.666667] — [3.111111] [3.555556] — [4.000000] [8.000000] — [8.4444444] [8.888889] — [9.333333] [10.666667] — [11.111111] [11.555556] — [12.000000]
Program:
Finally, let’s begin to write code for Ternary Cantor Set using the above concept described –
#include <bits/stdc++.h> using namespace std; // Linked List for the Cantor Set typedef struct cantor { double start; struct cantor* next; double end; } cantor; // Initialize the Cantor Set List cantor* List(cantor* head, double s_num, double e_num) { if (head == NULL) { head = new cantor; head->start = s_num; head->end = e_num; head->next = NULL; } return head; } cantor* update(cantor* head) { cantor* a = head; if (a != NULL) { cantor* newNode = new cantor; double d = (((a->end) - (a->start)) / 3); //Update the value newNode->end = a->end; a->end = ((a->start) + d); newNode->start = (newNode->end) - d; newNode->next = a->next; a->next = newNode; // Call the function recursively update(a->next->next); } return head; } // Function to display void print(cantor* a) { while (a != NULL) { printf("[%lf] -- [%lf]\t", a->start, a->end); a = a->next; } cout << endl; } void create(int x, int y, int z) { cantor* head = NULL; head = List(head, x, y); for (int i = 0; i < z; i++) { cout <<"Lvl_"<< i<<" : "; print(head); update(head); } cout <<"Lvl_"<< z<<" : "; print(head); } // Main function int main() { int x = 0; int y = 12; int z = 3; create(x, y, z); return 0; }
Output:
Here is the output
Lvl_0: [0.000000] — [12.000000] Lvl_1: [0.000000] — [4.000000] [8.000000] — [12.000000] Lvl_2: [0.000000] — [1.333333] [2.666667] — [4.000000] [8.000000] — [9.333333] [10.666667] — [12.000000] Lvl_3: [0.000000] — [0.444444] [0.888889] — [1.333333] [2.666667] — [3.111111] [3.555556] — [4.000000] [8.000000] — [8.4444444] [8.888889] — [9.333333] [10.666667] — [11.111111] [11.555556] — [12.000000]
Recommended Posts for you:
Leave a Reply