【发布时间】:2013-10-14 01:14:22
【问题描述】:
我已经编写了半个程序来进行一些主要的浮点数学运算。根据它开始的数据,它可以生成描述线段的非常大的数组。这些线段的位置是用笛卡尔坐标系记录的,用浮点数记录线段各端的X、Y、Z位置。我不能在两端使用 X,Y,Z,所以我使用 X,Y,Z 作为开始,使用 Q,R,S 作为结束。所以基本上我想做的是标记所有相同或翻转的行,以便第一行的 Q、R、S 等于第二行的 X、Y、Z 和第一行的 X、Y、Z 等于Q,R,S 在第二行。我目前的标记技术是将 X 设置为 -1,因为我知道没有一条线会以负坐标结束。我不想标记两条线,只标记除一条之外的所有线。这是我目前的功能:
int filter(int lines)
{
printf("Filtering...\n");
refline=0;
scanline=1;
while(refline<(lines))
{
if( segpointX[refline] == segpointQ[scanline] && segpointY[refline] == segpointR[scanline] && segpointZ[refline] == segpointS[scanline] && segpointQ[refline] == segpointX[scanline] && segpointR[refline] == segpointY[scanline] && segpointS[refline] == segpointZ[scanline]
|| segpointX[refline] == segpointX[scanline] && segpointY[refline] == segpointY[scanline] && segpointZ[refline] == segpointZ[scanline] && segpointQ[refline] == segpointQ[scanline] && segpointR[refline] == segpointR[scanline] && segpointS[refline] == segpointS[scanline])
{
//printf("Origional: %f %f %f >< %f %f %f\n",segpointX[refline],segpointY[refline],segpointZ[refline],segpointQ[refline],segpointR[refline],segpointS[refline]);
//printf("Duplicate: %f %f %f >< %f %f %f\n\n",segpointX[scanline],segpointY[scanline],segpointZ[scanline],segpointQ[scanline],segpointR[scanline],segpointS[scanline]);
segpointX[scanline]=-1;
}
scanline++;
if(scanline==lines+1)
{
refline++;
scanline=refline+1;
}
}
return(0);
}
我知道我有多少行,这就是“行”整数。这段代码完全按照它应该的方式工作,但与我的程序的其余部分相比它真的很慢。我认为必须有一种方法可以更快地做到这一点,但我不确定如何。拥有这个功能真的很可惜,因为它拖累了我的程序的其余部分,考虑到它的所有浮点数学,它的速度非常快。如果没有像样的方法让这个速度比现在快 3 倍,我可能只需要忍受混乱的数据并让下一个函数足够聪明以忽略它。然而,现在标记坏行将非常有用,因为下一个函数已经足够复杂,因为它不会尝试补偿我的数据中的重复项。
【问题讨论】:
-
线的哪一边留在 XYZ/QRS 中重要吗?顺便说一句,除非您的工作主要是在单个坐标上(例如,您首先处理所有 X,然后处理所有 Y,......)您应该使用一个合适的
struct数组来改善数据局部性并避免缓存未命中(除了,你会得到更容易理解的代码)。 -
不,哪一端是 X,Y,Z Q,R,S 都没有关系。现在最重要的是,如果发现重复的行,则将 X 设置为 -1
-
将你的区间放入类似于二叉搜索树的东西中,这样可以更快地搜索重复项(N*log(N) i/o O(N^2))。可以在这里寻找灵感:cslibrary.stanford.edu/110/BinaryTrees.html
-
使用哈希表通常会在 O(N) 中找到重复项。
标签: c arrays performance