【发布时间】:2010-01-07 09:26:25
【问题描述】:
我正在寻找改进我的算法以解决分配大量数据的难题。 如果有人能想到一些使它运行得更快的好主意,我将不胜感激。
我有 8 个文件包含 2 个参数:
1) 起点
2) 终点
这些类型的数据在文件中以不同的数字重复。 意味着我可以拥有一个包含 200 个起点 + 200 个终点的文件,或者一个包含 50000 个起点 + 50000 个终点的文件。
好的,这些数据的可能性反映了 X 轴数据点。每个点 start/end 将被排序到 X_sort_array 中。
问题从 Y 轴数据点开始。
为了创建 Y 轴数据点,我编写了一些算法,在整个 X_sort_array 点上运行,并检查每个点是否在所有起始点之间。如果是为 Y_array[x_point] 加一个等等...
我会在这里粘贴我的大部分代码,如果有语法/方法可以更高效地执行它,我会很高兴知道。
当 sort_all_legth 大于 50000 - 慢动作开始:
my $sort_all_length = @{$values{"$tasks_name[$i]\_sort\_allvals"}};
my $core_count = 0;
my $m=0;
for my $k(0 .. $sort_all_length-1){
if (($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] eq $values{"$tasks_name[$i]\_sort\_allvals"}->[$k-1])
& ($k != 0) ) {
}
else {
my $pre_point_flag;
# CHEACK PREVIUES POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1);
}
# CHEACK DEFINE POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k])
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$core_count++;
}
}
push(@{$values{"$tasks_name[$i]\_Y"}},$core_count);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]);
# CHEACK LATER POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1);
}
if ($y_max_val < $core_count){
$y_max_val = $core_count;
}
$core_count = 0;
$m++;
}
}
具有良好性能的小数据示例:
(IP 大小为 50000 时性能不佳!)
数据库:任务:字节位置
数据库:二进制文件大小:3216
数据库:开始/结束值的数量 = 804
数据库:计算已排序 I.P 数组中的活动核心数(大小:1608)...
数据库:IP数组值:
375127997,375135023,375177121,375177978,375225484,375226331, 375273745,375274563,375320063,375325255,375372479,375377085, 375422115,375422896,375473198,375474058,375517412,375518169, 375561967,375562760,375606301,375607092...
测试示例输入/输出:
输入是 X 轴上的起点和终点:
16,255
16,255
16,255
100,355
200,455
数据库:任务:测试
数据库:二进制文件大小:20
数据库:开始/结束值的数量 = 5
数据库:已排序的 I.P 数组(X 轴):
16,16,16,100,200,255,255,255,355,455
每个点都称为兴趣点(在 X 轴上)。
为了计算 Y 值,我用每个 I.P. 画一条垂直线
然后我计算有多少输入线(起点/终点)通过第一条垂直线。
结果是第一个 X I.P 的第一个 Y 点
数据库:计算已排序 I.P 数组中的活动核心数(大小:10)...
输出向量:
数据库:排序核心数组(Y 轴):
0,3,4,5,5,2,1,0
在我的算法中,我在每个 I.P 开始/结束块之前和之后添加了另一个点。
这样你就可以在开头/结尾看到零!
3 - 表示 X 点 16 处有 3 条切片线
4 - 表示在 X 点 100 处有 4 条切片线
5 - (1)表示在 X 点 200 处有 5 条切片线
5 - (2)表示在 X 点 255 处有 5 条切片线
2 - 表示在 X 点 355 处有 2 条切片线
1 - 表示 X 点 455 处有 1 条切片线
希望这些扩展示例能让您更了解算法。 :)
我将重建代码以提高可读性。
谢谢, 尤达。
【问题讨论】:
-
不显示代码,而是显示您拥有的一些示例数据
-
我很难弄清楚您要做什么。正如 ghostdog74 建议的那样,一些示例数据可能会有所帮助——输入数据和算法的期望结果。
-
我认为这里的算法比 Perl 本身更成问题。
标签: performance perl