Имя: Пароль:
1C
1С v8
Как найти элемент в массиве?
,
0 poi
 
06.05.19
18:26
инг = Истина;
ем = 3; // его надо найти

К = Новый Массив(); // в этом массиве
К.Добавить(1);
К.Добавить(2);
К.Добавить(3);
К.Добавить(4);

ан = 0;
Пока инг Цикл
Если К[ан] = ем Тогда
  инг = Ложь;
КонецЕсли

Если инг = Ложь Тогда
  Прервать
КонецЕсли

ан = ан + 1;
КонецЦикла

Сообщить(К[ан]);
1 timurhv
 
06.05.19
18:26
2 lodger
 
06.05.19
18:40
.найти()
3 Вафель
 
06.05.19
18:51
для поиска лучше соотвествие делать
4 palsergeich
 
06.05.19
19:48
(3) специально тестировал, на небольших коллекциях разница между массивом и соответствием / структурой на грани погрешности
5 palsergeich
 
06.05.19
19:49
Небольшие это порядка единиц тысяч элементов.
6 Garykom
 
гуру
06.05.19
19:50
Я реально не понял (0)
7 Garykom
 
гуру
06.05.19
19:52
Никто не проверял с массивами ЗначениеВСтрокуВнутр(Массив) и затем поиск в строке?
8 palsergeich
 
06.05.19
19:56
(7) а зачем?
9 Garykom
 
гуру
06.05.19
19:57
(8) Должно быть быстрее чем перебор массива, если надо просто узнать есть ли искомый элемент, без нахождения его номера.
10 palsergeich
 
06.05.19
19:58
(9) в теории да, но на практике (4) (5)
11 palsergeich
 
06.05.19
19:59
А там где десятки тысяч элементов, там и поиск в строке будет затратен
12 vde69
 
06.05.19
20:35
(4) я реально тестил производительность на массивах структурах и соответствиях (когда делал онлайн шахматы), массив на порядок быстрее работает даже для маленькой размерности, например 8х8 (массив массивов), 64 клетки
13 vde69
 
06.05.19
20:38
(12) +

имеется в виду не поиск а доступ по индексу или ключу
14 Dotoshin
 
06.05.19
20:57
(13) Ну так по индексу ты же из по конкретному адресу читаешь значение, все равно, что из переменной. Почему должно быть долго-то?
15 palsergeich
 
06.05.19
20:59
(12) Доступ по индексу и посик разные вещи.
Естесственно, что доступ по индексу в массиве будет быстрее, чем в структуре\соответствии, это связано с тем, что в массиве хранятся не сами значения, а адреса ячеек памяти, где хранятся значения.
Что бы получить доступ к i элементу, надо просто к адресу начала прибавить i*размер ячейки.
Доступ к ячейке массива имеет сложность o(1) (константное время вне зависимости от его длинны)
А вот с поиском значения - интереснее
16 palsergeich
 
06.05.19
21:05
И тут интересный вопрос: что быстрее при поиске - перебрать в ОЗУ все значения или вычислить хеш сумму и поиск в дереве.
Я лично тестировал на единицах тысяч элементов (парсер тех журнала), результат прям на грани погрешности.
На десятках тысяч - однозначно индексированная ТЗ и структура\соответствия быстрее.
17 Йохохо
 
06.05.19
21:13
(15) "к адресу начала прибавить i*размер ячейки" это верно если из 1с вычесть 1
18 palsergeich
 
06.05.19
21:15
(17) А на чем по твоему написан 1с?
19 palsergeich
 
06.05.19
21:15
(17) Ок там еще ++ есть
20 Йохохо
 
06.05.19
21:20
(18) массив указателей
21 palsergeich
 
06.05.19
21:24
(20) А указатель разве не имеет фиксированную длину?
22 Йохохо
 
06.05.19
21:25
(21) "Что бы получить доступ к i элементу" не к элементу
23 palsergeich
 
06.05.19
21:26
(22) Зануда) Ты прекрасно понял что я имел ввиду)
24 vde69
 
06.05.19
21:32
(15) >>> Что бы получить доступ к i элементу, надо просто к адресу начала прибавить i*размер ячейки.

в 1с это не так, в 1с нет типизированых массивов, и размер любого элемента неопределен....

массив в 1с - это по существу TList...
25 palsergeich
 
06.05.19
21:35
(24) В питоне тоже массив не типизированный, но тем неменее, там это работает так
26 palsergeich
 
06.05.19
21:37
что в массиве хранятся не сами значения, а адреса ячеек памяти, где хранятся значения
Вы чем все читаете...
27 palsergeich
 
06.05.19
21:38
А указатель имеет фиксированную длину...
28 poi
 
06.05.19
21:44
переделал. Вроде работает

e = 3; // его надо найти

К = Новый Массив(); // в этом массиве
К.Добавить(1);
К.Добавить(2);
К.Добавить(3);
К.Добавить(4);

Для а = 0 по 3 Цикл
Если К[а] = e Тогда
  сообщить(e);
  Прервать;
КонецЕсли
КонецЦикла
29 Йохохо
 
06.05.19
21:51
(28) у массива есть шикарный ВГраница, "по 3" это как откусить шаурмы у парадного
30 palsergeich
 
06.05.19
21:53
https://www.youtube.com/watch?v=Yx79E7GSCw0
Что касается Python: согласно документации:

Internally, a list is represented as an array; the largest costs come from growing beyond the current allocation size (because everything must move), or from inserting or deleting somewhere near the beginning (because everything after that must move).

Как видим, внутренне list представляет собой массив
31 palsergeich
 
06.05.19
21:55
(30) Уж если не верить этим пруфам, то я не знаю тогда чему в принципе верить
32 palsergeich
 
06.05.19
21:57
(31) С 6:22 по теме, я те тот тайм код вставил
33 Vinianel
 
06.05.19
22:01
(0)(28) Да вы шутите...
34 poi
 
06.05.19
22:05
(33) не совсем.
Был проверен закон Каннингема: https://meta.wikimedia.org/wiki/Cunningham%27s_Law/ru
в переменных (0) было закодировано его имя.
35 Сияющий в темноте
 
06.05.19
22:10
Любой список это либо массив либо последовательность (в последовательности каждый предыдущий ссылается на следующего-односвязный список или и последующий на предыдущего-двусвязный список)в массиве живут ячейки со значениями переменной чем то похожей на Variant от Microsoft(а он оттуда и вырос)некоторые значения хранятся в самой этой ячейки,а для обьекта в ячейке хранится ссылка на размещение обьекта в памяти.
массив в 1с не ассоциативный,так что доступ к значению по индексу,это просто операция умножения.
в структуре и соответствии,доступ к значению по ключу,это как доступ к элементу в ассоциативном массиве,но,по идее,для ключей должен быть индекс,а не полный перебор.
просто,некоторые языки программирования упорядочивают значения ассоциативного массива по ключу,что позволяет использовать поиск делением пополам,но тогда порядок полей меняется,а для 1с он важен,вот они и не стали велосипедов изобретать
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн