出于优化目的,我必须从给定的几个订单中找到一个共同的订单。我在那里加载一个文件,每一行都是用户,其动作命令作为动作的索引。
我想实现一个返回常用顺序的方法:
输入方法:用户是否输入订单(他们执行操作的顺序为[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 ++编写代码。
感谢任何帮助
感谢。
答案 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。