Как оптимизировать алгоритм для сопоставления составных RAR-файлов из ввода в PHP - PullRequest
1 голос
/ 27 июля 2010

Я ищу более оптимизированный способ поиска и группировки многочастных архивов из массива имен файлов

У меня в качестве ввода например:

array(
books.part1.rar,
books.part3.rar,
00000114.rar,
svoy_20ostrov.rar,
svoy_20ostrov.rar,
koncert_20v_20dk_20mir.rar,
koncert_20v_20centralnom_20teatre_20kukol.rar,
LP_LIVE_PR_Tampa.part2.rar,
koncert_20v_20dk_20vami.rar,
koncert_20v_20dk_20kommuna_20chast1.rar,
books.part2.rar,
koncert_20v_20dk_20kommuna_20chast2.rar,
books.part4.rar,
recedivist.rar,
LP_LIVE_PR_Tampa.part1.rar
)

И я ищу вывод

array(  

array(

books.part1.rar
books.part2.rar
books.part3.rar
books.part4.rar ) ,

00000114.rar
svoy_20ostrov.rar
koncert_20v_20dk_20mir.rar
koncert_20v_20centralnom_20teatre_20kukol.rar
koncert_20v_20dk_20vami.rar

array(
koncert_20v_20dk_20kommuna_20chast1.rar
koncert_20v_20dk_20kommuna_20chast2.rar
)

recedivist.rar
array (
LP_LIVE_PR_Tampa.part1.rar
LP_LIVE_PR_Tampa.part2.rar
)
)

Кстати, я использую php как язык программирования,

Идея заключалась в том, чтобы сопоставлять файлы регулярных выражений, такие как (. +). Part1.rar, а затем, когда они были найдены, сопоставлять все остальные части ([0-9] +). Rar (другой foreach требовал, чтобы циклы проходили по всему массиву. ) и при обнаружении unset () эти записи и добавить их в новый построенный массив

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Я бы сначала отсортировал массив, а затем прошел по нему, выполнив функцию Levenshtein () для следующей записи.

$rars = array(
    books.part1.rar,
    books.part3.rar,
    00000114.rar,
    svoy_20ostrov.rar,
    svoy_20ostrov.rar,
    koncert_20v_20dk_20mir.rar,
    koncert_20v_20centralnom_20teatre_20kukol.rar,
    LP_LIVE_PR_Tampa.part2.rar,
    koncert_20v_20dk_20vami.rar,
    koncert_20v_20dk_20kommuna_20chast1.rar,
    books.part2.rar,
    koncert_20v_20dk_20kommuna_20chast2.rar,
    books.part4.rar,
    recedivist.rar,
    LP_LIVE_PR_Tampa.part1.rar
)

sort($rars);
$current = 0;
$rars_complete = array();
foreach($rars as $i=>$rar) {
    $next = ($i + 1) < count($rars)) ? $i + 1 : false;
    $rars_complete[$current][] = $rar;
    if($next != false && levenshtein($rar, $rars[$next]) == 1)
        continue;
    else
        $current++;
}

Обратите внимание, это не проверено.

2 голосов
/ 27 июля 2010

Почему бы вам просто не отсортировать массив?Затем все, что вам нужно сделать, это определить, когда меняется начало строки, чтобы увидеть, когда начался новый набор.

...