我正在开展一个项目,我必须收到大量的记录(应用程序20K),每个记录都代表一个小数点(x,y)。
我有Point对象和双值m = user input
我需要消除所有具有比m更接近于m的点的点,例如,如果m = 0.1
和p1 = {1.21,1.32}, p2 = {1.21,1.31} p3 = {1.20, 1.32} p4 = {1.55, 1.31}
我需要消除p2,p3(作为p1的接近点),但是我需要消除它。保持p4,因为它与任何其他点的距离都大于0.1。
我实现了一个算法,但检查这个需要3个多小时(对于20K的记录,我认为这很荒谬,有没有办法使用.NET框架达到4.5?
答案 0 :(得分:1)
这里有几件事要尝试
删除Console.WriteLine
语句。输出20K x 20K = 400M行到控制台,所有这些都需要数小时和数小时,即使程序没有其他任何操作。如果您必须保留某种输出,则可以outputting to the same line instead of scrolling节省大量处理时间。
考虑在循环之前对列表进行排序,并修改循环,这样您只需要比较排序列表中彼此靠近的项目。例如,如果按Y排序,则外部循环将保持不变,但您可以使用for
替换内部while (full[j].Y < full[i].Y + maxVal)
语句。一旦到达列表的一部分,其中没有元素可能在maxVal中,您可以退出内部循环并继续前进到i
的下一个值。这会将您的性能配置文件从O(N ^ 2)更改为O(N)...更好。
如果您不需要超过七位有效数字,请考虑使用float
代替double
,这样可以加快数学运算速度。
考虑为duplicated
预分配内存。只要该列表超出其分配的大小,.NET就必须分配一个新列表(可能触发垃圾收集)并复制旧列表中的所有字节。您可以使用以下语法预分配空间:
var list = new List<Point>(20000);