For any given combination 'C' as an input of size 'k'. Following code computes the index of all the subsets of 'k-1' when all the combinations are arranged in lexicographic order. Combination 'C' consists of integers in sorted order from [1 to 'n'].
The following code has snippets borrowed from link1 and also the function 'nCr'-[Couldn't post the link as I had misplace. If anyone can point please let me know I will add it]
On executing the code, it seems to be very inefficient and takes unusually long time. Any help to improve it or point out issues is highly appreciated
#include <iostream>
#include <vector>
int nCr(int n, int r) {
    //Compute the factorials
    int ans = 1;
    r = std::min(r, n - r);
    for (int j = 1; j <= r; j++, n--) {
        if (n % j == 0) {
            ans *= n / j; 
        } else if (ans % j == 0) {
            ans = (ans / j) * n;
        } else {
            ans = (ans * n) / j;
            }
        }   
    return ans;
}
std::vector<int> compute_index (int n, int k, std::vector<int>& combination) {
    std::vector<int> result;
    result.clear();
    for (int ll = 0; ll < combination.size(); ++ll) {
        int index = 0;
        int j = 0;
        if (ll == 0) index = 1;
        for (int i = 0; i != k; ++i)
        {
            int test = combination[i];
            if (test == combination[ll]) {
                test = combination[(ll+1)%combination.size()];
            }
            for (++j; j != test; ++j)
            {
                index += nCr(n - j, k - i - 1);
            }
        }
        std::cout << index + 1 << std::endl;
        result.push_back(index);
    }
    return result;
}
int main()
{
    int n = 5;
    int k = 2;
    std::vector<int> combination  = {1, 2, 3};
    auto result = compute_index(n, k, combination);
    return 0;
}
Command to compile it :
g++ -std=c++11 -O3 test.cpp -o test
Aucun commentaire:
Enregistrer un commentaire