Стравнение элементов двух массивов ?

Тема в разделе "Perl программирование", создана пользователем Stan777, 1 янв 2007.

Статус темы:
Закрыта.
  1. Stan777

    Stan777 Гость

    Как органиовать быстрое стравнивание элементов двух массивов ? Имеем 2 массива, А и В как организовать быстрое сравнение элементов массивов, может перевести их Хеш, будет ли это эффективно, или простой FOR (@A) {.... FOR (.B.) {...}} будет быстрей ? Количество элементов более тысячи и элементы строки ??? Хотя Хеш тот же перебор но только элкментов хеш массива, что быстрей ? А можно передать массивы из перл-скрипта другой программе(скажем на Си) для сравния, возможны ли включения в перл-скрипты программ на Си, и передачи им целых массивов ?
     
  2. ccn

    ccn Гость

    Массивы упорядочены? Важен ли порядок при сравнении?
    Если элементы массива упорядочены, то сравнить можно join ('%', @a) cmp join ('%', @:), где '%' -- символ заведомо не встречающийся в строках-элементах массива.
    Поскольку операция сравнения достаточно трудоемкая, можно в придачу к каждому массиву хранить значение какой-нибудь хэш-функции от его элементов, например MD5. Тогда полноценное сравнение необходимо будет только для тех массивов, у которых отпечатки MD5 совпадают.
    Также кое-что может зависеть от характера используемых строк. Но это уже на конкретные данные нужно смотреть.



    Передать конечно можно, и включать вызовы сишных функций в перл-программу можно. Но это явно не тот случай, когда такое необходимо
     
  3. Stan777

    Stan777 Гость

    Нет, конечно массив не упорядочен, мне нужно сравнить каждый элемент массива @A c массивом @В, то есть каждую строку массива @А с каждой строкой массива @В, нужна вот такая сортировка массива @В.
    join ('%', @a) cmp join ('%', @B) я так понимаю вы объединяете строки массива, а потом сравниваете их, мне нужнo сравнить каждую строку отдельно.
     
  4. Stan777

    Stan777 Гость

    Да все спасибо Все сделал, опять совсем по другому и опять всё работает !
    типа unless exists ....
     
  5. ccn

    ccn Гость

    Если задача поставлена именно так, то, думаю,
    Код (Text):
    for my $ea (@a) { for my $eb (@b) { ... }}
    будет самым быстрым, но, use Benchmark чтобы определиться.

    С другой стороны, сравнение каждого элемента с каждым само по себе обычно не нужно, поэтому задача звучит странно. Есть стандартные задачи по нахождению объединения, пересечения и разности множеств -- может в действительности нужно именно это?
    http://www.unix.org.ua/orelly/perl/cookbook/ch04_09.htm
     
  6. _serg_

    _serg_ Гость

    народ, есть такая книжка "Perl. Сборник рецептов" (Perl Cookbook)
    горячо рекомендую всем в качестве настольного справочника. 99% вопросов сразу отпадет
     
  7. Stan777

    Stan777 Гость

    да я, в этой книге и нашел ответ на этот вопрос.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей