Find the value mapped to a given composite key for every query
Last Updated :
21 Mar, 2023
Given three arrays firstkey[], secondkey[] and value[] where elements firstkey[i] and secondkey[i] denotes a composite key and their value is value[i], the task is to answer Q queries, each having two elements which denotes the composite key, whose corresponding value needs to be printed.
Examples:
Input: firstkey[] = {4, 4, 5}
secondkey[] = {2, 1, 3}
value[] = {5, 3, 8}, Q = {(4, 1)}
Output: 3
Explanation:
The composite key is present at firstkey[1] (= 4) and secondkey[1] (= 1)
Therefore, the corresponding value is value[1] = 3
Input: firstkey[] = {3, 4, 3}
secondkey[] = {7, 1, 3}
value[] = {2, 3, 6}, Q = {(3, 3)}
Output: 6
Explanation:
The composite key is present at firstkey[2] (= 3) and secondkey[2] (= 3)
Therefore, the corresponding value is value[2] = 6
Approach: The idea is to use map where the key of the map is a pair of two integers in C++, tuple in python denoting the respective elements of firstkey[] and secondkey[] which is mapped to the corresponding value[] element. This enables us to answer every query in the O(1) time.
For Example:
Given arrays be -
firstkey[] = {4, 4, 5}
secondkey[] = {7, 1, 3}
value[] = {5, 3, 8}
Iterating over the Array, the map thus
formed is {(4, 7): 5, (4, 1): 3, (5, 3): 8}
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findCompositeKey( int firstkey[],
int secondkey[], int value[], int n,
vector<pair< int , int > > q)
{
map<pair< int , int >, int > M;
for ( int i = 0; i < n; i++) {
M.insert({ { firstkey[i], secondkey[i] },
value[i] });
}
for ( auto i : q) {
if (M.find({ i.first,
i.second })
!= M.end()) {
cout << M[{ i.first, i.second }]
<< endl;
}
else {
cout << "Not Found" << endl;
}
}
}
int main()
{
int firstkey[] = { 4, 4, 5 };
int secondkey[] = { 2, 1, 3 };
int value[] = { 5, 3, 8 };
int n = 3;
vector<pair< int , int > > q = { { 4, 1 },
{ 5, 2 },
{ 5, 3 } };
findCompositeKey(firstkey, secondkey,
value, n, q);
return 0;
}
|
Java
import java.util.*;
class GFG{
static class Pair
{
int first, second;
Pair( int first, int second)
{
this .first = first;
this .second = second;
}
@Override
public boolean equals(Object obj)
{
if (obj == null )
return false ;
if (!(obj instanceof Pair))
return false ;
if (obj == this )
return true ;
return ( this .first == ((Pair)obj).first) &&
( this .second == ((Pair)obj).second);
}
@Override
public int hashCode()
{
return this .first + this .second;
}
}
static void findCompositeKey( int firstkey[],
int secondkey[],
int value[], int n,
int [][] q)
{
Map<Pair, Integer> M = new HashMap<>();
for ( int i = 0 ; i < n; i++)
{
M.put( new Pair(firstkey[i],
secondkey[i]),
value[i]);
}
for ( int i = 0 ; i < q.length; i++)
{
if (M.containsKey( new Pair(q[i][ 0 ],
q[i][ 1 ])))
{
System.out.println(M.get( new Pair(q[i][ 0 ],
q[i][ 1 ])));
}
else
{
System.out.println( "Not Found" );
}
}
}
public static void main(String[] args)
{
int firstkey[] = { 4 , 4 , 5 };
int secondkey[] = { 2 , 1 , 3 };
int value[] = { 5 , 3 , 8 };
int n = 3 ;
int [][] q = { { 4 , 1 },
{ 5 , 2 },
{ 5 , 3 } };
findCompositeKey(firstkey, secondkey,
value, n, q);
}
}
|
Python3
def findCompositeKey(firstkey, secondkey, value, n, q):
M = {}
for i in range (n):
M[(firstkey[i], secondkey[i])] = value[i]
for i in q:
if (i[ 0 ], i[ 1 ]) in M:
print (M[(i[ 0 ], i[ 1 ])])
else :
print ( "Not Found" )
if __name__ = = '__main__' :
firstkey = [ 4 , 4 , 5 ]
secondkey = [ 2 , 1 , 3 ]
value = [ 5 , 3 , 8 ]
n = 3
q = [( 4 , 1 ), ( 5 , 2 ), ( 5 , 3 )]
findCompositeKey(firstkey, secondkey,
value, n, q)
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void FindCompositeKey( int [] firstkey,
int [] secondkey,
int [] value, int n,
List<Tuple< int , int > > q)
{
Dictionary<Tuple< int , int >, int > M
= new Dictionary<Tuple< int , int >, int >();
for ( int i = 0; i < n; i++) {
M.Add(Tuple.Create(firstkey[i], secondkey[i]),
value[i]);
}
foreach ( var i in q)
{
if (M.ContainsKey(
Tuple.Create(i.Item1, i.Item2))) {
Console.WriteLine(
M[Tuple.Create(i.Item1, i.Item2)]);
}
else {
Console.WriteLine( "Not Found" );
}
}
}
static void Main( string [] args)
{
int [] firstkey = { 4, 4, 5 };
int [] secondkey = { 2, 1, 3 };
int [] value = { 5, 3, 8 };
int n = 3;
List<Tuple< int , int > > q
= new List<Tuple< int , int > >{
Tuple.Create(4, 1), Tuple.Create(5, 2),
Tuple.Create(5, 3)
};
FindCompositeKey(firstkey, secondkey, value, n, q);
Console.ReadLine();
}
}
|
Javascript
function findCompositeKey(firstkey, secondkey, value, n, q) {
const M = new Map();
for (let i = 0; i < n; i++) {
M.set(`${firstkey[i]}_${secondkey[i]}`, value[i]);
}
for (let i of q) {
if (M.has(`${i[0]}_${i[1]}`)) {
console.log(M.get(`${i[0]}_${i[1]}`));
}
else {
console.log( "Not Found" );
}
}
}
const firstkey = [4, 4, 5];
const secondkey = [2, 1, 3];
const value = [5, 3, 8];
const n = 3;
const q = [[4, 1], [5, 2], [5, 3]];
findCompositeKey(firstkey, secondkey, value, n, q);
|
Time Complexity: O(nlogn)
Auxiliary Space: O(n) because using map
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...