Algorithms_in_C++ 1.0.0
Set of algorithms implemented in C++.
Loading...
Searching...
No Matches
floyd_cycle_detection_algo.cpp File Reference

Implementation of Floyd's Cycle Detection algorithm. More...

#include <cassert>
#include <iostream>
#include <vector>
Include dependency graph for floyd_cycle_detection_algo.cpp:

Namespaces

namespace  search
 for std::vector
 
namespace  cycle_detection
 Functions for the Floyd's Cycle Detection algorithm.
 

Functions

template<typename T >
int32_t search::cycle_detection::duplicateNumber (const std::vector< T > &in_arr, const uint32_t &n)
 The main function implements search algorithm.
 
static void test ()
 Self-test implementations.
 
int main ()
 Main function.
 

Detailed Description

Implementation of Floyd's Cycle Detection algorithm.

Given an array of integers containing 'n + 1' integers, where each integer is in the range [1, n] inclusive. If there is only one duplicate number in the input array, this algorithm returns the duplicate number in O(1) space and the time complexity is less than O(n^2) without modifying the original array, otherwise, it returns -1.

Author
Swastika Gupta

Function Documentation

◆ duplicateNumber()

template<typename T >
int32_t search::cycle_detection::duplicateNumber ( const std::vector< T > & in_arr,
const uint32_t & n )

The main function implements search algorithm.

Template Parameters
Ttype of array
Parameters
in_arrthe input array
nsize of array
Returns
the duplicate number
37 {
38 if (n == 0 ||
39 n == 1) { // to find duplicate in an array its size should be atleast 2
40 return -1;
41 }
42 uint32_t tortoise = in_arr[0]; // variable tortoise is used for the longer
43 // jumps in the array
44 uint32_t hare =
45 in_arr[0]; // variable hare is used for shorter jumps in the array
46 do {
47 tortoise = in_arr[tortoise];
48 hare = in_arr[in_arr[hare]];
49 } while (tortoise != hare);
50 tortoise = in_arr[0];
51 while (tortoise != hare) {
52 tortoise = in_arr[tortoise];
53 hare = in_arr[hare];
54 }
55 return tortoise;
56}
Here is the call graph for this function:

◆ main()

int main ( void )

Main function.

Returns
0 on exit
95 {
96 test(); // run self-test implementations
97 return 0;
98}
static void test()
Self-test implementations.
Definition floyd_cycle_detection_algo.cpp:64
Here is the call graph for this function:

◆ test()

static void test ( )
static

Self-test implementations.

Returns
void
64 {
65 // 1st test
66 // [3, 4, 8, 5, 9, 1, 2, 6, 7, 4] return 4
67 std::vector<uint32_t> array1 = {3, 4, 8, 5, 9, 1, 2, 6, 7, 4};
68 std::cout << "Test 1... ";
69 assert(search::cycle_detection::duplicateNumber(array1, array1.size()) ==
70 4); // here the duplicate number is 4
71 std::cout << "passed" << std::endl;
72
73 // 2nd test
74 // [1, 2, 3, 4, 2] return 2
75 std::vector<uint32_t> array2 = {1, 2, 3, 4, 2};
76 std::cout << "Test 2... ";
77 assert(search::cycle_detection::duplicateNumber(array2, array2.size()) ==
78 2); // here the duplicate number is 2
79 std::cout << "passed" << std::endl;
80
81 // 3rd test
82 // [] return -1
83 std::vector<uint32_t> array3 = {};
84 std::cout << "Test 3... ";
85 assert(search::cycle_detection::duplicateNumber(array3, array3.size()) ==
86 -1); // since the input array is empty no duplicate number exists in
87 // this case
88 std::cout << "passed" << std::endl;
89}
T endl(T... args)
T size(T... args)
Here is the call graph for this function: