查找数组中有多少个不同的浮点值

时间:2014-02-23 13:07:07

标签: c++ algorithm hash floating-point greatest-common-divisor

为了解决问题的一个部分,我需要 n 整数对 x y ,我需要找到有多少不同的 x / y 。 (精确值,带小数)

1

当然,我可以遍历所有先前的对,看看之前是否发生了相同的 x / y 值,但我相信,这会是(n ^ 2)/ 2 时间。

我尝试使用哈希表,它似乎不能很好地使用浮点值。也许它可以使用非常好的哈希函数。

2

考虑到 x y 是整数,我尝试了另一种解决问题的方法:

  • 计算每对的最大公约数
  • 用GCD划分 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,但分配的内存非常低。

3 个答案:

答案 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 ) ;
        }