[英]Find how many different float values I have in an array
为了解决问题的一部分,给我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,但是分配的内存非常低。
从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
您可以将x / y对存储在列表或数组中,并使用比较器功能对该列表进行排序,该比较器功能将x1 * y2和x2 * y1进行比较-请注意,所有计算均以整数形式进行。 排序(NlogN)后,遍历列表并计算不同的值(仅比较邻居)
另一种方法是将所有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 ) ;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.