int longestIncreasingSubsequence(std::vector<int> vect, int start, int end){ if(start == end) return 1; int middle = (start + end) / 2; std::vector<int> left; std::vector<int> right; for(int i = 0; i <= middle - start; i++) left.push_back(vect[i]); for(int i = middle - start + 1; i <= end - start; i++) right.push_back(vect[i]); int leftSide = longestIncreasingSubsequence(left, start, middle); int rightSide = longestIncreasingSubsequence(right, middle + 1, end); return maxOfThree(leftSide, rightSide, middleOut(left, right)); }
void* threadSearchDatabase(void* params) { auto thread_data = (ThreadSearchData*) params; thread_data->candidates.resize(thread_data->queries_length); std::vector<uint32_t> kmer_vector; std::vector<std::vector<int32_t>> hits(thread_data->queries_length); std::vector<float> min_scores(thread_data->min_scores); uint32_t log_counter = 0; uint32_t log_size = (thread_data->database_end - thread_data->database_begin) / (100. / log_step_percentage); float log_percentage = log_step_percentage; for (uint32_t i = thread_data->database_begin; i < thread_data->database_end; ++i) { if (thread_data->log && log_percentage < 100.0) { ++log_counter; if (log_size != 0 && log_counter % log_size == 0) { databaseLog(thread_data->part, thread_data->part_size, log_percentage); log_percentage += log_step_percentage; } } createKmerVector(kmer_vector, thread_data->database[i], thread_data->kmer_length); for (uint32_t j = 0; j < kmer_vector.size(); ++j) { if (j != 0 && kmer_vector[j] == kmer_vector[j - 1]) { continue; } Hash::Iterator begin, end; thread_data->query_hash->hits(begin, end, kmer_vector[j]); for (; begin != end; ++begin) { hits[begin->id].emplace_back(begin->position); } } for (uint32_t j = 0; j < thread_data->queries_length; ++j) { if (hits[j].empty()) { continue; } float similartiy_score = longestIncreasingSubsequence(hits[j]) / (float) chainGetLength(thread_data->database[i]); if (thread_data->candidates[j].size() < thread_data->max_candidates || similartiy_score > min_scores[j]) { thread_data->candidates[j].emplace_back(similartiy_score, i); min_scores[j] = std::min(min_scores[j], similartiy_score); } std::vector<int32_t>().swap(hits[j]); } } for (uint32_t i = 0; i < thread_data->queries_length; ++i) { std::sort(thread_data->candidates[i].begin(), thread_data->candidates[i].end()); if (thread_data->candidates[i].size() > thread_data->max_candidates) { std::vector<Candidate> tmp(thread_data->candidates[i].begin(), thread_data->candidates[i].begin() + thread_data->max_candidates); thread_data->candidates[i].swap(tmp); } } delete thread_data; return nullptr; }
int main() { vector<int> vec = {9,3,6,2,7}; cout << longestIncreasingSubsequence(vec) << endl; }