Суть проста: слить несколько отсортированных файлов в один. Реализация на php. Как вам кажеться это оптимальный алгоритм?
<?
$arr_files = glob ("splited/*");
$handles = array ();
foreach ($arr_files as $read_file)
{
$handles[] = fopen ($read_file, "rb");
}
$fh = fopen ("sorted_merge.txt", "w");
$arr_str = array ();
//$first_prog = 1;
$handles_buf = array ();
$counter = 0;
$old_counter = 0;
while (1 == 1)
{
$first = 0;
reset ($handles);
while (list ($k, $v) = each ($handles))
{
if (!isset ($handles_buf[$k])
or (@$handles_buf[$k]['counter'] > @$handles_buf[$k]['last']))
{
if (feof ($handles[$k]))
{
echo "\nFEOF {$arr_files[$k]}\n";
fclose ($handles[$k]);
unset ($handles[$k]);
unset ($handles_buf[$k]);
continue;
}
else
{
echo "\nread {$arr_files[$k]}\n";
unset ($handles_buf[$k]);
$buf = fread ($handles[$k], 10000000);
$buf .= fgets ($handles[$k]);
$handles_buf[$k]['arr'] = explode ("\n", $buf);
$handles_buf[$k]['counter'] = 0;
$handles_buf[$k]['last'] =
count ($handles_buf[$k]['arr']) - 1;
}
}
if ($first == 0)
{
$first = 1;
$first_num = $k;
}
else
{
if (strcmp
($handles_buf[$first_num]['arr']
[$handles_buf[$first_num]['counter']],
$handles_buf[$k]['arr'][$handles_buf[$k]['counter']]) > 0)
{
$first_num = $k;
}
}
}
if ($first == 0)
{
die;
}
fwrite ($fh,
$handles_buf[$first_num]['arr'][$handles_buf[$first_num]
['counter']]."\n");
$handles_buf[$first_num]['counter']++;
if ($counter - $old_counter > 10000)
{
echo "\r".$counter." $first_num ".
$handles_buf[$first_num]['arr'][$handles_buf[$first_num]
['counter']];
$old_counter = $counter;
}
$counter++;
}
?>
<?
$arr_files = glob ("splited/*");
$handles = array ();
foreach ($arr_files as $read_file)
{
$handles[] = fopen ($read_file, "rb");
}
$fh = fopen ("sorted_merge.txt", "w");
$arr_str = array ();
//$first_prog = 1;
$handles_buf = array ();
$counter = 0;
$old_counter = 0;
while (1 == 1)
{
$first = 0;
reset ($handles);
while (list ($k, $v) = each ($handles))
{
if (!isset ($handles_buf[$k])
or (@$handles_buf[$k]['counter'] > @$handles_buf[$k]['last']))
{
if (feof ($handles[$k]))
{
echo "\nFEOF {$arr_files[$k]}\n";
fclose ($handles[$k]);
unset ($handles[$k]);
unset ($handles_buf[$k]);
continue;
}
else
{
echo "\nread {$arr_files[$k]}\n";
unset ($handles_buf[$k]);
$buf = fread ($handles[$k], 10000000);
$buf .= fgets ($handles[$k]);
$handles_buf[$k]['arr'] = explode ("\n", $buf);
$handles_buf[$k]['counter'] = 0;
$handles_buf[$k]['last'] =
count ($handles_buf[$k]['arr']) - 1;
}
}
if ($first == 0)
{
$first = 1;
$first_num = $k;
}
else
{
if (strcmp
($handles_buf[$first_num]['arr']
[$handles_buf[$first_num]['counter']],
$handles_buf[$k]['arr'][$handles_buf[$k]['counter']]) > 0)
{
$first_num = $k;
}
}
}
if ($first == 0)
{
die;
}
fwrite ($fh,
$handles_buf[$first_num]['arr'][$handles_buf[$first_num]
['counter']]."\n");
$handles_buf[$first_num]['counter']++;
if ($counter - $old_counter > 10000)
{
echo "\r".$counter." $first_num ".
$handles_buf[$first_num]['arr'][$handles_buf[$first_num]
['counter']];
$old_counter = $counter;
}
$counter++;
}
?>