| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Массив и условие |
| Автор: AlexanderI 20.7.2006, 10:34 | ||
| Помогите создать условие. У меня есть массив: @massiv = qw(4 10 16 20); Каким образом создать условие так, чтобы проверялось сразу принадлежность каждого значения массива ? т.е например:
|
| Автор: Nab 20.7.2006, 15:23 | ||||
| неее, пользуйся лучше хешем... или вот так
Тут вкралась ошибочка, смотрите топик ниже Правильно вот так:
Хотя в данном конкретном случае это никак не влияет, мы проверяем существование ключа а не его истиннось, но ради принципа всеже этот вариант вернее... |
| Автор: Throne 20.7.2006, 15:44 | ||
В крайнем случае можно изобразить что-то типа
|
| Автор: DiverD 20.7.2006, 19:47 | ||
еще как вариант с форейчем:
|
| Автор: Ramirez 21.7.2006, 10:18 | ||
вот еще вариантец
|
| Автор: lanD 21.7.2006, 10:29 |
| Почитай про логические операторы |
| Автор: igorold 21.7.2006, 12:25 |
это из другой оперы - это ты проверяешь определен ли энный элемент массива, где эн=$cifra |
| Автор: sharq 21.7.2006, 14:42 | ||
AlexanderI,
|
| Автор: Nab 21.7.2006, 14:57 | ||
;) |
| Автор: sharq 28.7.2006, 22:19 |
| Nab, т.е. в твоем варианте прокатит: $cifra = 4, а какой-нить элемент массива @massiv 345 или 4me |
| Автор: Nab 28.7.2006, 23:34 | ||||
| Ну вот началось я так и знал что начнеться блин и в праздник обижают все знают как помочь беде ну ладно, так и быть скажу
или
|
| Автор: Danissimo 14.8.2006, 17:14 | ||||
2 Nab: Переведи, плз, 2-ю строчку |
| Автор: Nab 15.8.2006, 20:34 | ||||||||||||
Ууу, ее сложно в двух словах объяснить, но я попытаюсь В левой части выражения мы формируем срез хеша предсталенный в виде массива. И каждому элементу которого в правой части присваиваем 1. Срез хеша это приблизительно вот так:
Так как нас интересует присваивание то этот срез хеша попадает в левую часть. В правую попадает вот такое выражение:
оператор x - это повторитель, он повторяет элемент (число, строку) указанный как левый операнд... правый операнд определяет количество этих самых элементов. В нашем случае, это массив, который в скалярном контексте возвращает количество своих элементов. Вообще это один из самых простых способов заполнить хеш или массив повторяющимся или дефолтным значением. Я не скажу что это очень сложно, но осваивается с трудом Этот способ хорошо применим когда нужно перевернуть хеш, то есть поменять местами ключи и значения...
Конечно при одинаковых значениях элемент может потеряться, но какой именно, эт боюсь не скажу Ну вот вроде и все, надеюсь понятно объяснил Если что спрашивайте... |
| Автор: Danissimo 16.8.2006, 12:06 | ||
| Супер!!! 1. Правильно я понимаю, что
2. Про 1 x @mass я так и думал. Тока не понятно, зачем? Почему просто не сказать @{%hash}{@mass} = 1;? 3. Где написано, что в конструкции @{%hash}{@mass} сначала выполняется %hash{@mass}, а затем уже результат преобразовывается к массиву (или списку)? 4. Наскока я мог понять из прочтенного, список и массив -- разные вещи. (1, 2, 3) -- список, @x = (1, 2, 3) -- массив, в который скопированы элементы списка. Это верно? 5. Меня удручает, что не могу найти четких правил о семантике языка. Например, где однозначно говорится, в чем отличия в интерпретации @%hash{@mass} и @{%hash}{@mass}. Где? Если не сложно, конечно =) |
| Автор: Ramirez 9.9.2006, 00:15 | ||
| Замечательно. По-моему, посты товарища Nab'a вполне достойны размещения в каком нить FAQ. Вот кстати, иногода бывает такая ситуация:
т.е. из списка надо сделать хеш где значение ключа равно его(ключа) имени. мне кажется должен быть более красивый вариант, без foreach... |
| Автор: Nab 9.9.2006, 01:00 | ||||
Спасибо конечно А по существу, то, наверно вот так :
|
| Автор: korob2001 10.9.2006, 04:08 | ||
Ещё, как вариант:
|
| Автор: sharq 11.9.2006, 09:49 |
| korob2001, отличный вариант! Супер! |
| Автор: amg 12.9.2006, 08:30 | ||||
| Нравится мне этот форум! Есть над чем подумать. Вот, например, здесь предложили несколько вариантов решения практически важной задачи: выяснить, присутствует ли в списке данный элемент. Мне часто приходится иметь дело с огромными списками, поэтому я эти варианты поисследовал на предмет эффективности. Привожу результаты, может, кому-нибудь еще будет интересно.
Результаты:
Я для себя запомню два варианта: "korob2001" - совершенно неожиданный, но очень эффективный, и "Nab1" - не быстрый, но зато не требующий дополнительной памяти. |
| Автор: Nab 12.9.2006, 08:54 |
| amg, ты манияк от перла Кстати мне не понятны результаты вариантов diverd и sharq, они по идее аналогичны моему, но отжирают памяти порядочно Конечно они быстрее, но ... Видно какое-то оптимизирующее кеширование применяется... И похоже что одинаковое. |
| Автор: Nab 12.9.2006, 09:37 | ||||||
Кстати в моем первом варианте, вопрос не до конца продуман
Ведь в реальности получается что все время потрачено на заполнение и конвертирование одной формы списка в другую, хеш. Хотя у большинства это было просто заполнение массива. Я бы наверно предпочел сразу формировать хеш а не первоначальный список, но идея даже не в этом... Так как в список уникальных значений всего 4 то хеш в конечном итоге получиться всего из 4 элементов, и поиск по нему будет мизерно быстр Вариант 1
Вариант 2
можно пргнать с уникальным списком все варианты |
| Автор: amg 12.9.2006, 12:18 |
| Ага, когда компутер сначала надолго замолкает, а потом начинает молотить диском, впадая в глухой своп, поневоле станешь оптимизатором. Мне вот тоже непонятно, почему вариант "Nab1" не требует памяти, хотя, на первый взгляд, должен, а "diverd" - требует, хотя, казалось бы, и незачем. В общем, много еще нужно учиться. ЗЫ Это я на предыдущий пост... |
| Автор: amg 12.9.2006, 13:43 | ||||||||||
|
| Автор: sharq 12.9.2006, 13:58 | ||
| amg, интересно с помощью чего ты время тестировал? Попробуй Benchmark и повторов этак 10_000, привиди код и результаты. А с помощью Memchmark замереть память - не совсем хорошо, т.к.
А на счет вариантов мое мнение - вариант korob2001 - красивый, быстро работает из-за регулярных выражений, но есть недостатки, н-р - не найдешь индекс, найденного эелемента. Мой вариант - это стандартный в данной ситуации, в стиле Perl, но также есть недостатки. Вариант Nab (последний) - это вариант языка Си, прелести Perl нет. А первый вариант - map для этого не используется. List::Util - хороший модуль, но он загружается в память и для небольшой задачи это не нужно! Обычным перебором - хорошо, но не красиво Итог - вариант стоит использовать тот, кот. в данный ситуации будет наиболее приемлем. Н-р, я использую всегда красивый вариант, если не требуется оптимального решения! Поэтому grep и regexp - это то, что надо. |
| Автор: Nab 12.9.2006, 17:42 |
| Все верно ребята вы говорите Но как я сказал в предыдущем посте, то к примеру я, если мне нужно проверять наличие значения как такового, изначально использовал бы хеш. Ведь все равно производиться заполнение, массива или хеша, а в последствии к хешу доступ по этому параметру намного быстрее. Другое дело объем памяти Ну и конечно о красоте Хотя мои решения с map не такое уж страшное, и как оказалось и в нем есть рациональное зерно PS: amg, а покаж ка, как ты мерял? |
| Автор: Danissimo 12.9.2006, 17:49 |
| amg, хочу сказать, не удивляйся, что время поиска по хеш-таблице не зависит от количества элементов. Если посмотреть на цели, с которыми разрабатывались хеш-таблицы, то именно эта цель и преследовалась, а именно: время поиска не должно зависеть от количества элементов, то есть должно быть константным. На языке алгоритмического анализа это записывается так: O(n) = const =)) Я не знаю никакой другой структуры данных, у которой алгоритмическая сложность была бы величиной постоянной. Так что все работает, как и должно =) |
| Автор: korob2001 13.9.2006, 03:51 | ||
Кстати, amg если будет желаение, можешь попробовать компилировать шаблон только один раз, т.е. добавить модификатор "о" к регулярному выражению. Ведь у нас всё равно не меняется значение переменной $number.
|
| Автор: amg 13.9.2006, 12:02 | ||||||||||
Результаты (больше проценты - быстрее).
|
| Автор: amg 13.9.2006, 12:19 | ||||||||||
Добавлено @ 12:21
Спасибо! Буду знать. Добавлено @ 12:28
P.S. Прошу у всех прощения за многословие. |
| Автор: korob2001 14.9.2006, 00:12 |
Многословие в тему, потому прощения просить не нужно. |
| Автор: evilsoul 9.11.2008, 19:54 | ||
А ты попробуй к списку и массиву обратиться в скалярном контексте, и увидишь разницу |
| Автор: kavkaz 10.11.2008, 13:58 |
| думаю за два года он уже это сам понял |
| Автор: evilsoul 10.11.2008, 21:16 |
| Да а я чо то на даты и не глядел |
| Автор: Nab 15.2.2010, 21:05 | ||||||
И какова она?
Время не столь важно... |
| Автор: krypt3r 16.2.2010, 11:15 |
| Археологи) |