Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest way to find smallest missing integer from list of integers

I have a list of 100 random integers. Each random integer has a value from 0 to 99. Duplicates are allowed, so the list could be something like

56, 1, 1, 1, 1, 0, 2, 6, 99...

I need to find the smallest integer (>= 0) is that is not contained in the list.

My initial solution is this:

vector<int> integerList(100); //list of random integers
...
vector<bool> listedIntegers(101, false);
for (int theInt : integerList)
{
    listedIntegers[theInt] = true;
}
int smallestInt;
for (int j = 0; j < 101; j++)
{
    if (!listedIntegers[j])
    {
        smallestInt = j;
        break;
    }
}

But that requires a secondary array for book-keeping and a second (potentially full) list iteration. I need to perform this task millions of times (the actual application is in a greedy graph coloring algorithm, where I need to find the smallest unused color value with a vertex adjacency list), so I'm wondering if there's a clever way to get the same result without so much overhead?

like image 769
Tyson Avatar asked Nov 25 '18 11:11

Tyson


People also ask

How do you find the smallest positive integer that does not occur in an array?

Approach 2: Hashing Method We can solve this problem in linear time by using hashing. We loop over all the positive numbers, and check if it is present in the array or not by using a lookup table or hash map in O(1) time. The first element not found in the array will be the answer.

How do I find the smallest missing number in an array in C++?

$arr = array (0, 1, 2, 3, 4, 5, 6, 7, 10); $n = count ( $arr ); echo "Smallest missing element is " , findFirstMissing( $arr , 2, $n - 1);

How do you find the smallest missing number?

A simple analysis of the problem shows us that the smallest missing number would be the element's index, which is not equal to its element. For instance, consider array [0, 1, 2, 6, 9, 11, 15] . Here, the smallest missing element is 3 since 6 is present at index 3 (instead of element 3).


1 Answers

It's been a year, but ...

One idea that comes to mind is to keep track of the interval(s) of unused values as you iterate the list. To allow efficient lookup, you could keep intervals as tuples in a binary search tree, for example.

So, using your sample data:

56, 1, 1, 1, 1, 0, 2, 6, 99...

You would initially have the unused interval [0..99], and then, as each input value is processed:

56: [0..55][57..99]
1: [0..0][2..55][57..99]
1: no change
1: no change
1: no change
0: [2..55][57..99]
2: [3..55][57..99]
6: [3..5][7..55][57..99]
99: [3..5][7..55][57..98]

Result (lowest value in lowest remaining interval): 3

like image 161
500 - Internal Server Error Avatar answered Nov 10 '22 21:11

500 - Internal Server Error