繁体   English   中英

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

[英]Find how many different float values I have in an array

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

1。

当然,我可以遍历所有先前的对,看看之前是否出现过相同的x / y值,但是我认为这需要(n ^ 2)/ 2次。

我尝试使用哈希表,它与浮点值似乎不太兼容。 也许它将与一个非常好的哈希函数一起工作。

2。

考虑到xy是整数,我尝试了另一种方法来解决此问题:

  • 计算每对的最大公约数
  • 用GCD除以xy
  • 使用矩阵m [max_value_of_x] [max_value_of_y]并执行以下操作:

     if ( m[x][y] ) { ; } else { m[x][y] = 1 ; cnt++ ; } 
  • 在对所有对执行此操作之后, cnt应该是不同浮点值的数量。

我认为,尽管这可以在相当长的时间内完成。 它绝对不是空间有效的。 实际上,在该问题中, xy的最大值为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM