Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как найти элемент в массиве?

Как найти элемент в массиве?
Я
   poi
 
06.05.19 - 18:26
инг = Истина;
ем = 3; // его надо найти

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

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

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

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

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

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

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

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

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


К = Новый Массив();// в этом массиве

К.Добавить(1);
К.Добавить(2);
К.Добавить(3);
К.Добавить(4);

Для а = 0 по 3 Цикл
 Если К[а] = e Тогда
  сообщить(e);
  Прервать;
 КонецЕсли
КонецЦикла
   Йохохо
 
29 - 06.05.19 - 21:51
(28) у массива есть шикарный ВГраница, "по 3" это как откусить шаурмы у парадного
   palsergeich
 
30 - 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 представляет собой массив
 
 
   palsergeich
 
31 - 06.05.19 - 21:55
(30) Уж если не верить этим пруфам, то я не знаю тогда чему в принципе верить
   palsergeich
 
32 - 06.05.19 - 21:57
(31) С 6:22 по теме, я те тот тайм код вставил
   Vinianel
 
33 - 06.05.19 - 22:01
(0)(28) Да вы шутите...
   poi
 
34 - 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с он важен,вот они и не стали велосипедов изобретать


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.