Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 - Fatal编程技术网

C 优化阵列处理循环

C 优化阵列处理循环,c,algorithm,C,Algorithm,我正在做一个编程难题,我有点困惑。问题是在二维平面上计算磁盘相交的数量。x总是0,y是数组的索引。半径是存储在数组元素中的元素。对于元素数较少的元素,性能是可以的,但是对于像10000000这样的大量元素,性能是不好的。我目前正在使用2个嵌套for循环来处理数组 如果有人能给予我帮助,我将不胜感激。我被提供给我的数据结构所束缚,无法更改它们。如果磁盘与另一个磁盘相交,则计算,因为我处理的是整数,且中心点位于同一y轴上 代码如下: int number_of_intersections ( int

我正在做一个编程难题,我有点困惑。问题是在二维平面上计算磁盘相交的数量。x总是0,y是数组的索引。半径是存储在数组元素中的元素。对于元素数较少的元素,性能是可以的,但是对于像10000000这样的大量元素,性能是不好的。我目前正在使用2个嵌套for循环来处理数组

如果有人能给予我帮助,我将不胜感激。我被提供给我的数据结构所束缚,无法更改它们。如果磁盘与另一个磁盘相交,则计算,因为我处理的是整数,且中心点位于同一y轴上

代码如下:

int number_of_intersections ( int A[], int n ) 
{
 int base = 0;
 int inc = 0;
 int intersect = 0;
 int maxrad = 0;
 int x;

 if (n>1)
 { 
  for (base=0;base<(n-1);base++)
  {
   inc = base+1;
   do
   { 
    if ( inc - base <= (A[base] + A[inc]))  
    {                                    
     intersect ++;
     if (!(intersect^10000000))   
     {
      return -1;
     }
    }
    inc ++;
   } while (inc < n);
  }
 }

 return intersect;
}
int交叉口数(int A[],int n)
{
int base=0;
int inc=0;
int intersect=0;
int-maxrad=0;
int x;
如果(n>1)
{ 
对于(base=0;base您的方法是O(n^2),因为您正在测试每对光盘,因此大量光盘的速度很差

我想不出一种方法可以让我的大脑逐渐获得更好的性能,但是有一种优化方法你可以做到

假设你在元素p,半径为m。显然,每个位于p-m的圆盘你的方法是O(n^2),因为你在测试每对圆盘,因此大量圆盘的速度很差

我想不出一种方法可以让我的大脑逐渐获得更好的性能,但是有一种优化方法你可以做到


假设你在元素p,半径为m。显然,每个圆盘都位于p-m处,正如评论中指出的,这实际上是一个一维问题。事实上,这是一个关于相交区间的问题,其中区间[x,y]对应于磁盘中的最低和最高x坐标x=中心-半径,y=中心+半径


考虑沿x点和y点从左向右移动。通过保留指向磁盘的两个指针,一个用于x点,另一个用于y点,可以在不排序的情况下执行此操作。使用数据结构跟踪当前指针下的磁盘。当看到x点时,识别than点的磁盘和所有当前指针之间的交点磁盘,然后使其成为当前磁盘。当您看到y点时,请从当前磁盘中删除该点的磁盘。

正如注释中所指出的,这实际上是一个一维问题。事实上,这是一个关于相交间隔的问题,其中间隔[x,y]对应于磁盘中的最低和最高x坐标x=中心-半径,y=中心+半径


考虑沿x点和y点从左向右移动。通过保留指向磁盘的两个指针,一个用于x点,另一个用于y点,可以在不排序的情况下执行此操作。使用数据结构跟踪当前指针下的磁盘。当看到x点时,识别than点的磁盘和所有当前指针之间的交点磁盘,然后使其成为当前磁盘。当您看到y点时,请从当前磁盘中删除该点的磁盘。

您的代码闻起来像是过早优化


去掉外部if语句,因为它对您没有多大帮助(使用n时不会执行外部循环您的代码闻起来像是过早优化


去掉外部if语句,因为它对您没有多大帮助(外部循环不会以n开始执行,不要编写
if(!(intersect^1000000))
。只需编写
if(intersect==10000000)
。它更清晰。另外,你能在这里提供更多的上下文和示例吗?你尝试过什么?为什么它不起作用?如果x总是等于0,那么它是一个一维平面……某种程度上你的do-while循环的可读性要比(inc=base+1;incI不要得到那个模糊的代码:-)^10000000是怎么回事?请提高问题描述的质量。这是完全不可理解的。首先,如果x始终为0,那么你的问题似乎只是实线上的间隔问题。但即使如此,一维数组
a
如何传输有关
y
an元组的必要信息d radius?是否应该以某种方式对
A
进行排序?如果你真的想摆脱二次算法,你必须将其清理干净、规范化和代码化。不要将
int
用作通用数据类型。索引应该是
size\t
radii,可能是
double
左右。对于初学者,如果(!(intersect^1000000))
。只要写
if(intersect==10000000)
。这样更清楚。另外,你们能在这里提供更多的上下文和示例吗?你们尝试了什么?为什么不起作用?若x总是等于0,那个么它是一个一维平面……你们的do-while循环的可读性要比
更高(inc=base+1;incI不获取模糊代码。:-)^10000000是怎么回事?请提高问题描述的质量。这是完全不可理解的。首先,如果x始终为0,那么你的问题似乎只是实线上的间隔问题。但即使如此,一维数组
a
如何传输有关
y
an元组的必要信息d radius?是否应该以某种方式对
A
进行排序?如果你真的想摆脱二次算法,你必须将其清理干净、规范化和代码化。不要将
int
用作通用数据类型。索引应该是
size\t
RADIU,可能是
double
左右。
int number_of_intersections (int A[], int n) 
{
     int intersect = 0;
     const int maxIntersections = 10000000;    

     for (int base = 0; base <  n-1; base++)
     {
        for(int inc = base+1; inc < n; inc++)
        { 
           if (inc - base <= A[base] + A[inc])  
           {                                    
              intersect ++;
              if (intersect == maxIntersections) return -1;
           }
        }
     }

     return intersect;
}