I have an array of size n+1 where I wish to store the least cost of purchasing n
items(i^th
index stores cost of i^th
item).
There are m
different sellers: each seller provides item L
to item R
(where L
,R
>=1 and L
,R
<=n) for a cost of C
each.
To create the least cost array I did the following:
for (int i=1; i<=m; i++) {
int L = L of i^th seller
int R = R of i^th seller
int C = selling price of i^th seller
for (int j=L; j<=R; j++) {
if (leastCost[j]==0 || leastCost[j]>C) {
leastCost[j]=C
}
}
Constructing this array is O(n*m)
and accessing this array is O(1)
.
For very large values of n
and m
, is there a better way to construct the least cost array?
Perhaps a different approach of not storing it in an array and something else so that overall time complexity is reduced?
Definitely, we can do better than O(n*m) and also the solution is very simple.
Following is the pseudocode to solve this problem:
Construct a MIN-HEAP of the sellers based on their costs c.
Construct another array x[1...n] with its each element set to 0 initially.
Do the following initializations:
count=0
while(count < n)
{
S = EXTRACT_MIN(Heap)
if(count==0)
{
for(j=S.L to S.R)
{
leastCost[j]=S.c
++count
x[j]=S.R
}
}
else
{
for(j=S.L;j<=S.R;++j)
{
if(x[j]!=0)
{
i=x[j] and continue;
}
else
{
leastCost[j]=S.c
++count
x[j]=S.R
}
}
}
}
Explanation
The best optimization that we can achieve in this problem is that we skip all those array indices that are already filled because they already have least cost.
x the helper array: The array x helps us to skip all the array indices which have already been filled because:
x[i] stores the index j such that i to j already have least cost filled in the array so this is the reason for using the conditional statement:
if(x[i]!=0)
{
i=x[i] and continue;
}
So basically it is helping us to jump straight to the index which is not filled.
MIN-HEAP: It allows us to find the minimum cost c of all the costs present in time O(logm).
Time Complexity
Since we access the array leastCost at most n times therefore for accessing the array : O(n)
Building the heap takes O(m)
In Worst Case all the sellers will contribute to some indices and there will be exact m EXTRACT_MIN(Heap) operations and each takes O(logm) time so time for this is: O(m*logm).
Therefore total Time Complexity=O(n + mlogm + m) = O(n + mlogm).
By the way, If I was using C language, I would use struct for Seller and if Java then a class for Seller.Feel free for any queries.
You can use some form of stack here
1st sort all sellers by L. and by C desc if L equal.
Then starting from 1st seller(with min Li)
If stack is empty put him to the stack. If there are no more sellers with
(Lj == Li)
then cost[Li] = C[i]
and Li++
(in stack)
if there is entry with Lj == Li
then
if Rj < Ri
and Cj > Ci
skip
if Rj < Ri
and Cj < Ci
add this seller to stack
if Rj > Ri
and Cj > Ci
then pop current seller(i), add this seller(j) and add seller(i)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With