简化分子和分母的最快方法

时间:2018-03-13 04:46:30

标签: c++ algorithm math

说,我有两个序列。其中一个可以是分子,第二个是分母。两个序列都可以包含相同的变量。什么是摆脱分子和分母中重复变量的最快算法?

示例:初始序列。

A * B * C * D * O * V
---------------------
B * O * N * A * C

预期结果:A,B,C,O应该已经消失。

D * V
-----
N

我目前唯一的想法是创建两个数组并使用两个循环来查找和删除匹配元素。也许有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

您应该查看std::set_interaction,它可用于确定两个已排序集合中的常用数字。

e.g。

 std::vector< int > inter;
 std::set_intersection (numerator.begin ( ), numerator.end ( ), 
                        denominator.begin ( ), denominator.end ( ), 
                        std::back_inserter (inter));

现在删除分子中的公共数字:

 if (inter.size() != 0)
 {
   std::vector<int> leftn;
   std::set_difference (numerator.begin ( ), numerator.end ( ), 
   inter.begin ( ), inter.end ( ), std::inserter (leftn, leftn.begin ( )));
   ...
 then do the same for denominator

但是我认为你应该首先确保你的分母和分子被分成素数,然后才能尝试上述结果

e.g。

  2 * 4               4 
  -----  would yield ---   which obviously could be simplified more
  2 * 2               2

  2 * 2 * 2           2
  ---------   -->    ---
    2 *  2            1

但也许你已经这样做了。

编辑:已整理的集合

答案 1 :(得分:1)

这是我的解决方案,排序分子和分母,然后比较相等的范围

std::vector<std::string> num = {"A", "B", "C", "D", "O", "V"};
std::vector<std::string> den = {"B", "O", "N", "A", "C"};

// sort to compare equal_ranges
std::sort(std::begin(num), std::end(num));
std::sort(std::begin(den), std::end(den));

decltype(std::equal_range(std::begin(num), std::end(num), "")) num_er{std::begin(num), std::begin(num)};
decltype(std::equal_range(std::begin(den), std::end(den), "")) den_er{std::begin(den), std::begin(den)};

while(num_er.second != std::end(num) && den_er.second != std::end(den))
{
    // next value to check (numerator or denominator?)
    auto v = num_er.second;
    if(*den_er.second < *v)
        v = den_er.second;

    // find the equal ranges
    num_er = std::equal_range(num_er.second, std::end(num), *v);
    den_er = std::equal_range(den_er.second, std::end(den), *v);

    // count the number of this value for num and den
    auto num_size = std::distance(num_er.first, num_er.second);
    auto den_size = std::distance(den_er.first, den_er.second);

    // erase from either num or den (or both)

    if(num_size >= den_size)
        num_er.second = num.erase(num_er.second - den_size, num_er.second);

    if(den_size >= num_size)
        den_er.second = den.erase(den_er.second - num_size, den_er.second);
}

for(auto const& s: num)
    std::cout << s << ' ';
std::cout << '\n';
std::cout << "-------------------" << '\n';
for(auto const& s: den)
    std::cout << s << ' ';
std::cout << '\n';

<强>输出:

D V 
-------------------
N