Algorithms_in_C++  1.0.0
Set of algorithms implemented in C++.
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

 search
 for std::vector
 
 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. More...
 
static void test ()
 Self-test implementations. More...
 
int main ()
 Main function. More...
 

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 || n == 1) { // to find duplicate in an array its size should be atleast 2
39  return -1;
40  }
41  uint32_t tortoise = in_arr[0]; // variable tortoise is used for the longer
42  // jumps in the array
43  uint32_t hare = in_arr[0]; // variable hare is used for shorter jumps in the array
44  do {
45  tortoise = in_arr[tortoise];
46  hare = in_arr[in_arr[hare]];
47  } while (tortoise != hare);
48  tortoise = in_arr[0];
49  while (tortoise != hare) {
50  tortoise = in_arr[tortoise];
51  hare = in_arr[hare];
52  }
53  return tortoise;
54 }
Here is the call graph for this function:

◆ main()

int main ( void  )

Main function.

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

◆ test()

static void test ( )
static

Self-test implementations.

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