Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找数组中有多少不同的浮点值_C++_Algorithm_Hash_Floating Point_Greatest Common Divisor - Fatal编程技术网

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

C++ 查找数组中有多少不同的浮点值,c++,algorithm,hash,floating-point,greatest-common-divisor,C++,Algorithm,Hash,Floating Point,Greatest Common Divisor,为了解决一个问题的一个部分,在这个问题中,我得到了n对x和y,我需要找出有多少不同的x/y。(精确值,带小数) 一, 当然,我可以遍历前面的所有对,看看之前是否出现过相同的x/y值,但我相信这需要(n^2)/2时间 我试着使用一个哈希表,但它似乎不能很好地处理浮点值。也许它会与一个非常好的散列函数一起工作 二, 考虑到x和y是整数,我尝试了一种不同的方法来解决这个问题: 计算每对的最大公约数 用GCD除以x和y 使用矩阵m[max_value_of_x][max_value_of_y]并执行以

为了解决一个问题的一个部分,在这个问题中,我得到了nxy,我需要找出有多少不同的x/y。(精确值,带小数)

一,

当然,我可以遍历前面的所有对,看看之前是否出现过相同的x/y值,但我相信这需要(n^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,但分配的内存非常少。

您可以将x/y对存储在列表或数组中,并使用比较函数对该列表进行排序,比较x1*y2和x2*y1-请注意,所有计算都是整数。排序(NlogN)后,遍历列表并从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
struct cmp\u div{
布尔运算符()(常数std::pair&xy1,常数std::pair&xy2)常数{
//x1/y1另一种方法是将所有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 ) ;
        }
设置存储;//根据需要的精度选择数据类型。
//如果arr[]是包含对x和y的给定数组。
商店。清除()。
对于(i=0;i
所以成对的
(6,2)
(9,3)
会被认为是相同的吗?你可以在减少它们之后对它们进行排序,甚至不必按值排序,也可以按字典顺序排序-你所需要的只是让相同的分数彼此相邻。然后,只需计算相同分数的运行次数。占用的空间要小得多。听起来你可以在这些对之间循环,pl将
x/y
放入
std::set
,然后得到集合的大小。我想应该是O(n logn)。是的,对(6,2)和(9,3)都是一样的,因为6/2=9/3=3.00非常好。不过,你是在为他做技术作业吗?一个小小的改进是先减少分数,或者使用长-长来执行比较,以避免int溢出。此外,MBo应该注意,所有答案和注释都自然避免浮点比较,尽管我相信它们不会ld在这种情况下可以很好地工作。@Steger难道他们没有机会从背后捅你一刀(就像浮点数一样)并比较两个非常接近的分数相等吗?请注意,使用comparator设置的解决方案(很可能)将具有相同的O(NlogN)时间就像排序一样,但是代码更短、更优雅。在使用集合时,我在哪里可以找到关于这个比较器如何工作的更多信息?我相信
(x/gcd(x,y)/(y/gcd(x,y))
中的所有除法都是整数除法,这对于
x/gcd(x,y)
y/gcd(x,y)来说都是不错的
但这意味着
y
的值最多为1。此外,除以GCD是不必要的。
float q=(float)x/y;
我认为是正确的。