#0
by Торин
Уважаемые коллеги! Есть ли в 1С метод (или можно ли его придумать?), позволяющий получить "пересечение массивов" - т.е. оставить в первом массиве только те элементы. которые имеются во втором БЕЗ перебора каждого из масивов? Задачка такая -- есть 1 массив строк (5-10) и есть 2 массив строк (~1000). Можно ли как-нить удалить из первого массива строки, которых нет во втором, без того, чтобы писать два цикла? В каком-нить RUBY это стандартный оператор языка...
#10
by 73
Преобразовать в ТЗ. ТЗ параметром. Поместить во временную таблицу. Далее пакетным запросом. Если соединением - так обе. Если В(&Второймассив) - второй массив передать параметром, преобразовывать в ТЗ не надо.
#11
by Asmody
мдя... сомнительное решение: гонять массив стачала в ТЗ, потом - на сервер во врем.таблицу, потом обратно, быстрее циклом перебрать
#12
by Торин
Вот как "поместить во временную таблицу"? Ну тупой,я тупой... Как пакетный запрос писать я понимаю. Как в одном из запросов пакета выбрать значения из параметра?
#16
by Торин
Спасибо большое. К сожалению, никогда так не делал и даже не знал, что так можно... Все заработало...
#20
by Торин
Интересное решение... Щас проверю, что будет работать быстрее или запрос. Проверю на тех параметрах, что я указал вначале -1 массив 5-10 элементов, 2 массив - 900-1000
#24
by NS
Хотя если в меньшем массиве строк заведомо меньше Log2 количества строк в большем массиве - тогда без сортировки, и поиск перебором.
#25
by Торин
О, гуру подтягиваются... Сергей, при каких объемах массивов есть смысл замарачиваться с бинарным поиском?
#27
by Торин
Да, быстрее в 2,5 раза. Видимо запрос начнет обгонять при десятках тысяч во втором и сотнях в первом массиве
#29
by NS
На сортировку тратится О(N*LN(N)) операций, полсе этого на проверку бинарным поиском О(K*LN(N)) операций, К - размер меньшего массива, то есть сложность алгоритма с сортировкой N*LN(N). Если отсортируем меньший массив, то на сортировку K*LN(К), на бинарный поиск поиск N*LN(К), то есть я ошибся - лучше сортировать меньший массив, тогда сложность (N*LN(K)) Без сортировки сложность алгоритма N*K, то есть даже если в меньшем массиве меньше 10 элементов, то лучше его отсортировать и бинарным. Все выкладки сделаны без перевода массива в ТЗ. В случае ТЗ - встроенный поиск работает весьма быстро, и тут уже надо проводить тесты.
#32
by NS
Добавление индекса равносильно сортировке с последующим бинарным поиском. Вообще самое быстрое - Xbase с добавленным индексом по меньшему массиву. Могу накидать код на 7.7 (восьмерки нет под рукой)
#37
by NS
Расчет значения Хеш-функции по большему массиву займет больше времени, чем поиск в меньшем массиве по индексу (бинарный поиск).
#40
by NS
проблема в том, что создание ДБФ-а занимает времени больше 20 мс., которые уходят на поиск перебором... Тебе нужно чтоб стало быстрее, перебора?! Именно на значениях 10 и 1000?
#41
by Stepa86
если массив чисто из строк и прям так нужна скорость, то может написать простенькую компоненту на более низкоуровневом и через нее? или джава скрипт заюзать...
#42
by 73
Вариант с запросом проигрывает по той же причине. Помещение во временную таблицу занимает время...
#45
by NS
Если взять 100 и 10000 тогда тупой перебор 1349 мс. индекс 223 мс. А если массивы как указано в 10 и 1000 тогда тупой перебор 14 мс. индекс 155 мс. Причем Индекс - практически всё потраченное время это создание файла.
#46
by Торин
Нет, реальные значения будут *10 = т.е сотни и десятки тысяч. Это пока тестовая задачка. Да, скорость очень важна. А на чем можно написать такую ВК? На ПИТОНе или ПРОЛОГе ведь ВК для 1с-ки не напишешь...
#50
by 73
Потестить на реальных данных надо. Соотношение времён здесь озвученных решений могут существенно поменяться.
#51
by Stepa86
только ассемблер, он быстрее!!! а вообще вроде есть шаблоны ВК на дельфях и наверняка есть примеры пересечения массивов на них же в инете... так что собрать из этого компоненту думаю будет просто и быстро
#52
by Торин
первый массив -это массив строк из внешнего файла, второй - это некий справочник внутри базы, значение текстового поля неограниченной длины...
#53
by NS
В восьмерке быстро работает "соответсвие" - оно индексировано. Работает быстрее XBase. Никакого ВК не нужно, ибо время тратится только на поиск в индексированной структуре.
#54
by 73
Если там справочник, то в варианте с запросом не надо его поле выгружать в массив чтобы потом назад в запрос передавать... Возможно быстродействия запроса будет достаточно.
#56
by _Atilla
ТЗ1 и ТЗ2. ТЗ1 колонку "количество" заполняешь 1 ТЗ2 колонку "количество" заполняешь 2 сливаешь обе ТЗ в одну. сворачиваешь и суммируешь по колонке "количество". там где "количество" равно 3, значит это значение существует в обоих. там где "количество" равно 1, значит это значение существует только в первом массиве. там где "количество" равно 2, значит это значение существует только во втором массиве.
#57
by NS
тупой перебор 1363 мс. индекс 92 мс. ТЗ 183 мс. Это если 100 и 10000, без времени создания XBase и ТЗ. Если использовать структуру, то будет быстрее второго варианта. То есть код получится быстрее чем свернуть - и понятно почему - свернуть работает за N LN N А второй вариант это N LN K
#59
by NS
+ Не структуру, а соответсвие. Я несколько лет назад проводил тесты - "соответствие" заметно быстрее XBase, то есть работать будет просто влет, быстрее не напишешь и на языках высокого уровня.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Как сдать уточненные индивидуальные сведения за 2000 год?
- v7: Как ПРОГРАММНО вытащить таблицу MXL из конфы в файл?
- Как установить цвет строки в управляемой форме? Цвет берется из реквизита
- Очень долго открывается конфигуратор
- ЗУП 31.4 4ФСС - задолженность за страхователем на начало периода
- Как в ЗУП выплатить не начисленную ЗП
- Windows 7 ошибка загрузки модуля basic.dll
- Перепрошивка модема ZyXEL u336ePlus
- ЗУП: Как сделать(привязать) совмещение профессии в 1С ЗУП?
- Кнопка Параметры виртуальной таблицы
- СКД - Выбранные поля - несколько вертикальных группировок рядом объединяются
- Проблема с получением ОболочкаActiveDocument
- ЗиУП Взаимодействие Кадровика и Расчетчика.
- Договора ГПХ в БП 2.0
- Расходная накладная долго открывается
- Не работает отбор по номенклатуре в СКД
- Правила обмена УПП - УПП
- отладка работы с чеком ККМ
- Перенос из УНФ в БП
- Начисление износа в БП 2.0 (счет 010)