In: Computer Science
What structure would you select if a customer came and said, I want to have a program where I would be updating the data (I would be putting more data in) and later I want to retrieve in their initial order (I want to get them out in the order they were inserted). What would the most sufficient structure to do that? Explain in your own words.
Following are detailed operations.
insert(x)
1) Check if x is already present by doing a hash map lookup.
2) If not present, then insert it at the end of the array.
3) Add in the hash table also, x is added as key and last array
index as the index.
remove(x)
1) Check if x is present by doing a hash map lookup.
2) If present, then find its index and remove it from a hash
map.
3) Swap the last element with this element in an array and remove
the last element.
Swapping is done because the last element can be removed in O(1)
time.
4) Update index of the last element in a hash map.
getRandom()
1) Generate a random number from 0 to last index.
2) Return the array element at the randomly generated index.
search(x)
Do a lookup for x in hash map.
Below is the implementation of the data structure.
/* C++ program to design a DS that supports folloiwng operations 
in Theta(n) time 
a) Insert 
b) Delete 
c) Search 
d) getRandom */
  
#include<bits/stdc++.h> 
using namespace std; 
  
// class to represent the required data structure 
class myStructure 
{ 
    // A resizable array 
    vector <int> arr; 
      
    // A hash where keys are array elements and vlaues are 
    // indexes in arr[] 
    map <int, int> Map; 
  
    public: 
    // A Theta(1) function to add an element to MyDS 
    // data structure 
    void add(int x) 
    { 
        // If ekement is already present, then noting to do 
        if(Map.find(x) != Map.end()) 
            return; 
              
        // Else put element at the end of arr[] 
        int index = arr.size(); 
        arr.push_back(x); 
              
        // and hashmap also 
        Map.insert(std::pair<int,int>(x, index)); 
    } 
          
    // function to remove a number to DS in O(1) 
    void remove(int x) 
    { 
        // element not found then return 
        if(Map.find(x) == Map.end()) 
            return; 
              
        // remove element from map 
        int index = Map.at(x); 
        Map.erase(x); 
              
        // swap with last element in arr 
        // then remove element at back 
        int last = arr.size() - 1; 
        swap(arr[index], arr[last]); 
        arr.pop_back(); 
              
        // Update hash table for new index of last element 
        Map.at(arr[index]) = index; 
    } 
          
    // Returns index of element if element is present, otherwise null 
    int search(int x) 
    { 
        if(Map.find(x) != Map.end()) 
        return Map.at(x); 
        return -1; 
    } 
          
    // Returns a random element from myStructure 
    int getRandom() 
    { 
        // Find a random index from 0 to size - 1 
        srand (time(NULL)); 
        int random_index = rand() % arr.size(); 
              
        // Return element at randomly picked index 
        return arr.at(random_index); 
    }      
}; 
  
// Driver main 
int main() 
{ 
    myStructure ds; 
    ds.add(10); 
    ds.add(20); 
    ds.add(30); 
    ds.add(40); 
    cout << ds.search(30) << endl; 
    ds.remove(20); 
    ds.add(50); 
    cout << ds.search(50) << endl; 
    cout << ds.getRandom() << endl; 
}