Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3630244
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 19, 20262026-05-19T00:14:44+00:00 2026-05-19T00:14:44+00:00

I’m working on a research problem out of curiosity, and I don’t know how

  • 0

I’m working on a research problem out of curiosity, and I don’t know how to program the logic that I’ve in mind. Let me explain it to you:

I’ve four vectors, say for example,

v1 = 1 1 1 1
v2 = 2 2 2 2
v3 = 3 3 3 3
v4 = 4 4 4 4

I want to add them combination-wise. That is,

v12 = v1+v2
v13 = v1+v3
v14 = v1+v4
v23 = v2+v3
v24 = v2+v4
v34 = v3+v4

Till this step it is just fine. The problem/trick is now, at the end of each iteration I give the obtained vectors into a black box function, and it returns only a few of the vectors, say v12, v13 and v34. Now, I want to add each of these vectors one vector from v1, v2, v3, v4 which it hasn’t added before. For example, v3 and v4 hasn’t been added to v12, so I want to create v123 and v124. Similarly for all the vectors like,

v12 should become:
v123 = v12+v3
v124 = v12+v4

v13 should become:
v132 // This should not occur because I already have v123
v134 = v13+v4;

v14,v23 and v24 cannot be considered
because it was deleted in the black
box function so all we have in our
hands to work with is v12,v13 and v34.

v34 should become:
v341 // Cannot occur because we have 134
v342 = v34+v2

It is important that I do not do it all in one step at the start. Like for example, I can do (4 choose 3) 4C3 and finish it off, but I want to do it step by step at each iteration.

How do do it when the black box function is included?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-19T00:14:45+00:00Added an answer on May 19, 2026 at 12:14 am

    Okay, here goes, this probably could be made more efficient, but I think this does what you need.

    #include <vector>
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    #include <set>
    #include <map>
    
    using namespace std;
    
    typedef vector<int> v_t;
    typedef set<int> s_t;
    typedef map<s_t, v_t> m_t;
    typedef vector<pair<s_t, v_t> > b_t;
    
    // this inserts a new entry into the map with the provided key
    // the value_type (vector) is generated by adding the entries in each vector
    // NOTE: the first vector is passed by value (so we get a copy in the function)
    // the second vector (passed by ref) is then added to it.
    void insert_entry(m_t& dest, s_t& key, v_t vdest, v_t const& v2)
    {
      v_t::const_iterator it2(v2.begin());
      // there is no global operator+ for vector, so you have to do something like below
      for(v_t::iterator it(vdest.begin()), end(vdest.end()); it != end && (*(it++) += *(it2++)););
      // this is just debug
      cout << "new key: " << key.size() << " : ";
      copy(key.begin(), key.end(), ostream_iterator<int>(cout, " "));
      cout << endl;
      cout << "vec: ";
      copy(vdest.begin(), vdest.end(), ostream_iterator<int>(cout, " "));
      // actual insert in to map
      // for example, key may be set<1, 2> and value is vector <3, 3, 3, 3>
      dest.insert(dest.end(), make_pair(key, vdest));
      cout << "size of dest: " << dest.size() << endl;
    }
    
    // This function generates all unique combinations of a given size and inserts them into 
    // the main map
    void gen_comb(size_t cmb, b_t const& base, m_t& dest)
    {
      typedef m_t::iterator m_it;
    
      cout << "combination size: " << cmb << endl;
    
      // Now calculate our starting vector key size, a "key" is imply a combination of
      // vectors, e.g. v12, v23 v14 etc. in this case key size = 2 (i.e. two vectors)
      // If we need to generate combinations of size 3 (cmb=3), then we start with all
      // vectors of key size = 2 (v12, v23, v14 etc.) and add all the base (v1, v2 v3) to it
      size_t s_ksz = cmb - 1; // search key size
      cout << "search size: " << s_ksz << endl;
      // now iterate through all entries in the map
      for(m_it it(dest.begin()); it != dest.end(); ++it)
      {
        // Aha, the key size matches what we require (for example, to generate v123, we
        // need v12 (key size == 2) first
        if (it->first.size() == s_ksz)
        {
          // Now iterate through all base vectors (v1, v2, v3, v4)
          for(b_t::const_iterator v_it(base.begin()), v_end(base.end()); v_it != v_end; ++v_it)
          {
            // new key, start with the main key from map, e.g. set<1, 2>
            s_t nk(it->first.begin(), it->first.end());
            // Add the base key set<3>, reason I do it this way is that, in case you
            // that base vectors should be other than size 1 (else insert(*((*v_it)->first.begin())) should work just fine.
            nk.insert(v_it->first.begin(), v_it->first.end());
            // check if this key exists, this is the main check, this tests whether our map
            // already has a key with the same vectors (for example, set<1,2,3> == set<2,3,1> - internally set is ordered)
            m_it k_e = dest.find(nk);
            // If the key (combination of vectors) does not exist, then insert a new entry
            if (k_e == dest.end())
            {
              // new key
              insert_entry(dest, nk, it->second, v_it->second);
            }
          }
        }
      }
    }
    
    void trim(size_t depth, m_t& dest)
    {
      for(m_t::iterator it(dest.begin()); it != dest.end();)
      {
        if (it->first.size() == depth && (rand() % 2))
        {
          cout << "removing key: " << depth << " : ";
          copy(it->first.begin(), it->first.end(), ostream_iterator<int>(cout, " "));
          cout << endl;
          dest.erase(it++);
        }
        else
          ++it;
      }
    }
    
    int main(void)
    {
      // combination map
      m_t dest;
    
      // this is the set of bases
      b_t bases;
      int max_i = 4;
      for(int i = 1; i <= max_i; ++i)
      {
        v_t v(4, i);
        s_t k;
        k.insert(i);
        bases.push_back(make_pair(k, v));
      }
    
      // for the start, push in the bases
      dest.insert(bases.begin(), bases.end());
    
      // for each combination size, generate a new set of vectors and then trim that set.
      for (size_t cmb = 1; cmb <= static_cast<size_t>(max_i); ++cmb)
      {
        if (cmb > 1) gen_comb(cmb, bases, dest);
        trim(cmb, dest); // randomly remove some entries...
      }
    
    
      return 0;
    }
    

    NOTES:

    1. the trim function models your black box which removes some entries from the main map with a given key size (same size as the most recently generated combinations)
    2. I’m not sure about the validity of iterating through the map and inserting new entries (i.e. how it impacts the iterator, it appears to work, but I think there may be something subtle that I am missing – it’s far too late at night to think about that right now!)
    3. Performance, may not be ideal, as you need to iterate through all keys to find the search size (for combination).
    4. assumes that all vectors have the same size (but this can be fixed trivially)
    5. If you take out the debug, you’ll see that the actual code is quite small..
    6. The order of the combination is not preserved – not sure if this is necessary for you

    EDIT:
    Okay now base is a vector which contains a pair for the key<->vector relationship – this is constant. Initially it is added to the map, and the gen_comb function is skipped for the initial state, trim is still called to remove some entries. Next iteration uses the same search algorithm, but the combination is with the constant set of bases.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I know there's a lot of other questions out there that deal with this
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this
I'm working with an upstream system that sometimes sends me text destined for HTML/XML
Let's say I'm outputting a post title and in our database, it's Hello Y&#8217;all
link Im having trouble converting the html entites into html characters, (&# 8217;) i
That's pretty much it. I'm using Nokogiri to scrape a web page what has
I've got a string that has curly quotes in it. I'd like to replace
I have a small JavaScript validation script that validates inputs based on Regex. I
I have a French site that I want to parse, but am running into
I am doing a simple coin flipping experiment for class that involves flipping a

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.