|
Как найти элемент в массиве? | ☑ | ||
---|---|---|---|---|
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с он важен,вот они и не стали велосипедов изобретать |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |