Your friends have been studying the closest prices of tech stocks, looking for i
ID: 3848027 • Letter: Y
Question
Your friends have been studying the closest prices of tech stocks, looking for interesting patterns. They've defined something called a rising trend, as follows:
They have the closing price for a given stock recorded for n days in succession; let these prices be denoted P[1], P[2], …, P[n]. A rising trend in these prices is a subsequence of the prices P[i1], P[i2], …, P[ik] for days i1<i2<…<ik, so that
• i1 =1, and
Thus a rising trend is a subsequence of the days—beginning on the first day and not necessarily contiguous—so that the price strictly increases over the days in this subsequence. They are interested in finding the longest rising trend in a given sequence of prices.
Example. Suppose n = 7, and the sequence of prices is
10,1,2,11,3,4,12.
Then the longest rising trend is given by the prices on days 1, 4, and 7. Note that days 2, 3, 5, and 6 consist of increasing prices; but because this subsequence does not begin on day 1, it does not fit the definition of a rising trend.
(a) Show that the following algorithm does not correctly return the length of the longest rising trend, by giving an instance on which it fails to return the correct answer.
Define i=1
L=1
For j=2 to n
If P[j] > P[i] then
Set i=j.
Add 1 to L.
Endif
Endfor
In your example, give the actual length of the longest rising trend, and say what the algorithm above returns.
(b) Give an efficient algorithm that takes a sequence of prices P[1], P[2], …, P[n] and returns the length of the longest rising trend.
j-1Explanation / Answer
a) Created below code to test your algorithm:
#include <stdio.h>
int main()
{
int P[] = {10,1,2,11,3,4,12};
int i=1;
int L=1;
int n=7;
int j;
for( j=2; j< n; j++) {
if(P[j] > P[i]) {
i = j;
L++;
}
}
printf("Length: %d ", L);
return 0;
}
· Thus, your algorithm is wrong, Because, your algorithm always start with the first element and then tries to compare other values with that.
· While, indeed, the sequence may not always start with value present at index 0.
b)
Correct Algorithm:
Let P[0..n-1] be the input array and L(i) be the length of the Longest rising trend ending at index i such that P[i] is the last element of the Longest rising trend starting from P[0].
For i=1,2,....,n
L[i]=1
If P[i]>P[1]
For j=1,2,....,i-1
If P[j]<P[i] And L[i]<L[j]
L[i]=1+L[j]
Essentially we are using the formula:
OPT(i)=1+maxj|j<i,P[j]<P[i]OPT(j)
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.