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

  • Автор темы Stan777
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Stan777

#1
Как органиовать быстрое стравнивание элементов двух массивов ? Имеем 2 массива, А и В как организовать быстрое сравнение элементов массивов, может перевести их Хеш, будет ли это эффективно, или простой FOR (@A) {.... FOR (.B.) {...}} будет быстрей ? Количество элементов более тысячи и элементы строки ??? Хотя Хеш тот же перебор но только элкментов хеш массива, что быстрей ? А можно передать массивы из перл-скрипта другой программе(скажем на Си) для сравния, возможны ли включения в перл-скрипты программ на Си, и передачи им целых массивов ?
 
C
#2
Массивы упорядочены? Важен ли порядок при сравнении?
Если элементы массива упорядочены, то сравнить можно join ('%', @a) cmp join ('%', @:), где '%' -- символ заведомо не встречающийся в строках-элементах массива.
Поскольку операция сравнения достаточно трудоемкая, можно в придачу к каждому массиву хранить значение какой-нибудь хэш-функции от его элементов, например MD5. Тогда полноценное сравнение необходимо будет только для тех массивов, у которых отпечатки MD5 совпадают.
Также кое-что может зависеть от характера используемых строк. Но это уже на конкретные данные нужно смотреть.



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

Stan777

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

Stan777

#4
Да все спасибо Все сделал, опять совсем по другому и опять всё работает !
типа unless exists ....
 
C
#5
мне нужно сравнить каждый элемент массива @A c массивом @В, то есть каждую строку массива @А с каждой строкой массива @В
Если задача поставлена именно так, то, думаю,
Код:
for my $ea (@a) { for my $eb (@b) { ... }}
будет самым быстрым, но, use Benchmark чтобы определиться.

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

_serg_

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

Stan777

#7
да я, в этой книге и нашел ответ на этот вопрос.
 
Статус
Закрыто для дальнейших ответов.