简化分子和分母的最快方法
Fastest way to simplify numerator and denominator
本文关键字:方法 更新时间:2023-10-16
比如说,我有两个序列。其中一个可以是分子,第二个是分母。两个序列可能包含相同的变量。去除分子和分母中重复变量的最快算法是什么?
示例:初始序列。
A * B * C * D * O * V
---------------------
B * O * N * A * C
预期成果:A、B、C、O本应消失。
D * V
-----
N
我目前的唯一想法是创建两个数组并使用两个循环来查找和删除匹配的元素。也许有更好的解决方案?
你应该看看std::set_interaction
,它可以用来从两个排序集合中确定公共数字。
例如
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
但是,我认为您应该首先确保您的分母和分子被分成素数,然后再尝试上述方法以获得最佳结果
例如
2 * 4 4
----- would yield --- which obviously could be simplified more
2 * 2 2
2 * 2 * 2 2
--------- --> ---
2 * 2 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
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法