Имя: Пароль:
1C
1С v8
Поиск пары значений
0 Dirk Diggler
 
23.03.17
14:36
Есть пары строковых значений, А и В.
В процессе работы алгоритма надо составлять хранить множество пар, и периодически проверять в этом множестве наличие/отсутствие нужной. Какими средствами оптимальней сделать? Массивы, списки что-то не оч. удобны.
1 HardBall
 
23.03.17
14:38
Соответствие.
2 Михаил Козлов
 
23.03.17
14:39
Соответствие. В качестве ключа, например "А|В".
3 Вафель
 
23.03.17
14:40
тз индексированная
4 DrShad
 
23.03.17
14:42
полный перебор запросом
5 Dirk Diggler
 
23.03.17
22:11
(2) усложняем задачу. Одно значение не строковое, а допустим ссылка на справочник.
6 Garykom
 
гуру
23.03.17
22:23
(5) ВидОбъекта ("Справочник.Номенклатура")+ИдентификаторОбъекта(например УИД)
7 Zmich
 
24.03.17
06:19
(5). И Ключ, и Значение в Соответствии могут быть любого типа, в том числе СправочникСсылка.
8 Провинциальный 1сник
 
24.03.17
07:26
Индексированная таблица значений - самое очевидное
9 FIXXXL
 
24.03.17
08:58
если значений два - я за соответствие
по Ключу А получаешь пару и проверяешь В на равенство Значению
10 Dirk Diggler
 
24.03.17
12:47
(9) ну вот есть пары
А - 1
А - 2
Б - 1
Б - 2

По ключу А я получу какую из пар?
11 Михаил Козлов
 
24.03.17
13:00
(10) По ключу А вы не запихнете в соответствие 2 значения.
12 Вафель
 
24.03.17
13:05
если хэш по простому от пары не посчитать, то лучше тз
13 FIXXXL
 
24.03.17
13:07
(10) тогда только (12)
14 Torquader
 
25.03.17
01:44
Что такое пара значений - это сложный индекс.
И хранить его нужно как и все сложные индексы - сначала упорядочить по первому значению, потом по второму.

В 1С проще всего использовать таблицу значений и добавить составной индекс по двум столбцам.

Если А-1 и 1-А это одно и то же значение, то перед поиском или добавлением делаем упорядочивание Левый<=Правый.
15 Ildarovich
 
25.03.17
04:00
На мой вкус, в этой задаче лучше использовать соответствие соответствий.
Во всяком случае, для представления связей в графе - самое то. Примеры можно посмотреть здесь http://catalog.mista.ru/public/79285/ (Задача 3),
здесь http://catalog.mista.ru/public/460935/ (Задача 33),  здесь http://catalog.mista.ru/public/326983/ (Метод 3.4) и так далее.

Большим достоинством такого подхода является:
1) простота проверки наличия пары
Пара[А][Б] <> Неопределено
2) возможность хранения веса пары;
3) скорость удаления пары по сравнению с удалением пары в начале таблицы значений, когда приходится сдвигать вверх все последующие строки;
4) автоматическая защита от записи дубликатов.

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

Некоторым недостатком такого представления, с моей точки зрения, является определенная "корявость" записи новой пары, поскольку, если А во внешнем соответствии еще нет, то приходится создавать новое вложенное соответствие вот таким куском кода:
Если Пара[А] = Неопределено Тогда Пара[А] = Новый Соответствие
КонецЕсли
.

Кроме того, из соответствия нельзя одной строкой получить массив первых или вторых элементов пар, как это можно сделать из таблицы значений.

Но для меня компактность записи при высокой скорости перевешивает, поэтому и использую чаще всего именно этот способ.
16 RomanYS
 
25.03.17
09:22
(15) "1) простота проверки наличия пары
Пара[А][Б] <> Неопределено"
Оно же ошибку будет давать при отсутствии А
17 Ildarovich
 
25.03.17
10:05
+(15)(16) Да, согласен, поторопился - пункт 1 в общем случае требуется уточнить:

1. Простота проверки:
Пара[А] <> Неопределено И Пара[А][Б] <> Неопределено
Второе условие не будет проверяться и давать ошибку, если А не будет во внешнем соответствии.
18 Мимохожий Однако
 
25.03.17
10:13
(0) Регистр сведений с двумя измерениями без ресурса
19 Garykom
 
гуру
25.03.17
13:51
(15) Интересное решение, но не проще/быстрее один или два списка значений и двумерный массив (в котором наличие пары это 1 на пересечении номеров значений из списка)?
20 Garykom
 
гуру
25.03.17
14:01
(18) Думаем есть какие то отличия от ТЗ/ТЧ из двух колонок?
21 Garykom
 
гуру
25.03.17
14:09
В задаче так то 2 подзадачи:
1. Имея пару значений узнать содержится ли эта пара в множестве
2. Имея одно значение узнать какие есть пары с этим значением в множестве

Если требуется решать только подзадачу 1 то банальный хеш по паре значений (причем желательно симметричный) и пишем куда то.
В качестве хэша 2 строк можно взять попарное сложение кодов символов этих строк.
22 NSSerg
 
25.03.17
16:10
(14) Звучит как ультиматум :)
Варианта как минимум два, и решение зависит от задачи.
Если нам не нужно упорядочивание и/или поиск в интервале значений, то лучше Хеш.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший