Exemplo n.º 1
0
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));
}
Exemplo n.º 2
0
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;
}