为了解决问题的一个部分,我需要 n 整数对 x 和 y ,我需要找到有多少不同的 x / y 。 (精确值,带小数)
1
当然,我可以遍历所有先前的对,看看之前是否发生了相同的 x / y 值,但我相信,这会是(n ^ 2)/ 2 时间。
我尝试使用哈希表,它似乎不能很好地使用浮点值。也许它可以使用非常好的哈希函数。
2
考虑到 x 和 y 是整数,我尝试了另一种解决问题的方法:
使用矩阵m [max_value_of_x] [max_value_of_y]并执行此操作:
if ( m[x][y] ) { ; } else { m[x][y] = 1 ; cnt++ ; }
对所有对执行此操作后, cnt 应为不同浮点值的数量。
虽然这可以运行,但我想,在相当长的时间内;它绝对不是空间效率。在实际问题中, x 和 y 的最大值为1000,但分配的内存非常低。
答案 0 :(得分:1)
从MBo的解决方案中使用集合:
struct cmp_div {
bool operator ()(const std::pair<int, int>& xy1, const std::pair<int, int>& xy2) const {
// x1/y1 < x2/y2
return xy1.first*xy2.second < xy2.first*xy1.second;
}
};
std::set<std::pair<int, int>, cmp_div> c;
c.emplace(6, 2);
c.emplace(9, 3);
std::cout << c.size(); // == 1
答案 1 :(得分:0)
您可以在列表或数组中存储x / y对,并使用比较器函数对此列表进行排序,该函数比较x1 * y2和x2 * y1 - 请注意所有计算都是整数。排序后(NlogN),遍历列表并计算不同的值(仅比较邻居)
答案 2 :(得分:0)
另一种方法是将所有x / y值存储在一个集合中,避免重复的条目。 这可以通过
来实现 set < float > store ; // choose the datatype according to the precison needed .
// If arr[] is the given array containing pair x and y .
store . clear () ; .
for ( i = 0 ; i < arr.size() ; i++)
{ x = arr[i].first ; y = arr[i].second ;
float y = (x/gcd(x,y) / (y/gcd(x,y)) ; // For precison round the values
store.insert ( y ) ;
}