Я ищу для улучшения моего алгоритма для загадки массива данных.Если кто-нибудь может придумать хорошую идею, которая заставит его работать быстрее, я буду признателен.
У меня есть 8 файлов, содержащих 2 параметра:
1) начальная точка
2) конечная точка
Эти типы данных повторяются с разными номерами в файле.означает, что у меня может быть файл с 200 начальными точками + 200 конечными точками или файл с 50000 начальными точками + 50000 конечными точками.
ОК, эти случайные данные отражают точки данных оси X.каждая точка начала / конца будет отсортирована в 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!)
база данных: задача: byte_position
база данных: размер двоичного файла: 3216
база данных: число начальных / конечных значений = 804
база данных: подсчет активных ядер в отсортированном массиве IP (размер: 1608) ...
база данных: значение массива IP:
375127997,375135023,375177121,375177978,375225484,375226331, 375273745,375274563,375320063,375325255,375372479,375377085, 375422115,375422896,375473198,375474058,375517412,375518169, 375561967,375562760,375606301,375607092 ...
* *1038* 1040 *
входами являются начальная и конечная точки на оси X:
16,255
16,255
16,255
100,355
200,455
база данных: задача: TEST
база данных: размер двоичного файла: 20
база данных: количество начальных / конечных значений = 5
база данных: отсортированный массив IP (ось X):
16,16,16,100,200,255,255,255,355,455
каждая из этих точек называется интересной точкой (по оси X).
для вычисления значений Y я рисую вертикальную линию с каждым IP
затем я подсчитываю, сколько входных линий (начальная / конечная точка) проходит через первую вертикальную линию.
результат - первая точка Y для первой базы данных X IP
: подсчет активных ядер в отсортированном массиве IP (размер: 10) ...
выходной вектор:
база данных: массив отсортированных ядер (ось Y):
0,3,4,5,5,2,1,0
В моем алгоритме я добавил еще одну точку до и после каждого IP, который начинает / заканчивает блок.
так вы можете видеть ноль аt начало / конец!
3 - означает, что в точке X есть 3 линии среза 16
4 - означает, что в точке X есть 4 линии среза 100
5 -(1) означает, что в точке X имеется 5 линий среза 200
5 - (2) означает, что в точке X имеется 5 линий среза 255
2 - означает, что в точке X имеется 2 линии срезаточка 355
1 - означает, что в точке X есть 1 линия среза 455
Надеюсь, что этот расширенный пример поможет вам лучше понять алгоритм.:)
Я восстановлю код для удобства чтения.
Спасибо, Yodar.