寻找共同的独特订单

时间:2014-07-23 17:06:38

标签: c++ qt optimization

出于优化目的,我必须从给定的几个订单中找到一个共同的订单。我在那里加载一个文件,每一行都是用户,其动作命令作为动作的索引。

我想实现一个返回常用顺序的方法:

输入方法:用户是否输入订单(他们执行操作的顺序为[0,1,2,3,4])

      user1         0,1,2,4,3
      user2         0,1,2,3,4
      user3         0,2,1,3,4
      user4         0,1,3,2,4
      ...

我想找到独特的共同/全球订单。我想找到大多数用户喜欢的订单。

如何实现这样的方法或算法?

我用Qt用C ++编写代码。

感谢任何帮助

感谢。

1 个答案:

答案 0 :(得分:1)

假设您将订单存储在std::vector<int>中,问题的标准解决方案是使用std::nth_element查找所有订单中的中间项。

示例:

  // Our orders
  std::vector<int> o1 = { 0,1,2,4,3 };
  std::vector<int> o2 = { 0,1,2,3,4 };
  std::vector<int> o3 = { 0,2,1,3,4 };
  std::vector<int> o4 = { 0,1,3,2,4 };

  // Regroup items by type
  std::vector<int> item1 = { o1[0] , o2[0], o3[0], o4[0] };
  std::vector<int> item2 = { o1[1] , o2[1], o3[1], o4[1] }; 
  std::vector<int> item3 = { o1[2] , o2[2], o3[2], o4[2] }; 
  std::vector<int> item4 = { o1[3] , o2[3], o3[3], o4[3] };

  // Lookup median elements
  std::nth_element(item1.begin(), item1.begin() + item1.size()/2, item1.end());
  std::nth_element(item2.begin(), item2.begin() + item2.size()/2, item2.end());
  std::nth_element(item3.begin(), item3.begin() + item3.size()/2, item3.end());
  std::nth_element(item4.begin(), item4.begin() + item4.size()/2, item4.end());

  std::cout << "Most wanted item 1 is " << item1[item1.size()/2] << '\n';
  std::cout << "Most wanted item 2 is " << item2[item2.size()/2] << '\n';
  std::cout << "Most wanted item 3 is " << item3[item3.size()/2] << '\n';
  std::cout << "Most wanted item 4 is " << item4[item4.size()/2] << '\n';

<强>输出:

  

最想要的第1项是0

     

最想要的第2项是1

     

最想要的第3项是2

     

最想要的第4项是3

现场演示here