Problem Statement:目的は、nlogn時間で最も長くなるサブシーケンス(連続していない)を見つけることです。Longest NlogNのサブシーケンスの長さを増やす[Algoを理解する]
アルゴリズム:ここで説明するアルゴリズムは理解しています。 http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/。
私が理解できなかったことは、次のコードの末尾に何が格納されているかです。例えば
int LongestIncreasingSubsequenceLength(std::vector<int> &v) {
if (v.size() == 0)
return 0;
std::vector<int> tail(v.size(), 0);
int length = 1; // always points empty slot in tail
tail[0] = v[0];
for (size_t i = 1; i < v.size(); i++) {
if (v[i] < tail[0])
// new smallest value
tail[0] = v[i];
else if (v[i] > tail[length-1])
// v[i] extends largest subsequence
tail[length++] = v[i];
else
// v[i] will become end candidate of an existing subsequence or
// Throw away larger elements in all LIS, to make room for upcoming grater elements than v[i]
// (and also, v[i] would have already appeared in one of LIS, identify the location and replace it)
tail[CeilIndex(tail, -1, length-1, v[i])] = v[i];
}
return length;
}
入力は{2,5,3、11,8,10,13,6}である場合、 コードは6 として正しい長さを与えるが、尾は2,3を記憶します、6,8,10,13。
だから私は尾に格納されているものを理解したいのですか?これはこのalgoの正しさを理解するのに役立ちます。
返信ありがとうございます。最小値を説明してください。 –
@NikhilSaxena、 'min(長さiの増加する部分配列の最後の要素)' – DAle