|
Поиск в ассоциативном массиве | ☑ | ||
---|---|---|---|---|
0
Сергей Д
31.07.15
✎
11:16
|
Доброго всем дня.
Имеется ассоциативный массив: номер - значение. Элементы массива отсортированы по возрастанию номера. Задача простая: найти элемент с нужным номером и взять его значение. Первое, что приходит в голову - использовать бинарный поиск. Но вот что смущает. К примеру, есть массив: 100 - 1 101 - 2 102 - 3 200 - 4 201 - 5 Нужно получить значения двух элементов: 101 и 102. Бинарным поиском находим 101. Следующим запросом нужно найти 102. Опять делать бинарный поиск. Но нельзя ли сделать быстрее: мы только что нашли 101 и знаем его индекс. Массив отсортирован по возрастанию, значит, 102 где-то рядом (номер-то не сильно отличается от уже найденного). Обязательно ли использовать бинарный поиск или есть механизмы, оптимизирующие поиск? Однако если нужно получить 102 и 200, то скорее всего придется использовать поиск 2 раза, т.к. номера различаются значительно, хотя и находятся рядом. Реализация будет проводится на Turbo Pascal (он еще жив :) ). |
|||
1
asady
31.07.15
✎
11:28
|
(0) номер всегда int ?
номера уникальны? |
|||
2
Сергей Д
31.07.15
✎
11:30
|
(1) Номера числовые, уникальные, целые, положительные.
|
|||
3
asady
31.07.15
✎
11:32
|
(2) тогда
1) результаты всех поисков в кэш. 2) поиск ведется по диапазону который вычисляется с учетом кэша. |
|||
4
Михаил Козлов
31.07.15
✎
11:33
|
Индекс (дерево) не пригодится? (правда, придется потратиться на его создание).
|
|||
5
1Сергей
31.07.15
✎
11:35
|
>>Реализация будет проводится на Turbo Pascal (он еще жив :) ).
Пишу из под стола. Вы меня убили! |
|||
6
Сергей Д
31.07.15
✎
11:37
|
(3) Думал про кэш. Но тогда придется делать поиск уже по 2 массивам: кэшу и основному (если не нашел в кэше). Будет ли это быстрее?
Стал думать в сторону запоминания индекса последнего найденного элемента, вычисления расстояния до элемента, который надо найти и выбора: то ли делать поэлементный перебор от последнего, то ли бинарный поиск, если это расстояние превышает некоторый критерий. (4) С деревьями ни разу не работал (увы). Хотя... всегда приятно освоить что-то новое. (5) Это программа для промышленного контроллера. Там операционка, совместимая с ДОС6.2. |
|||
7
asady
31.07.15
✎
11:40
|
(6) если исходный массив много больше кэша - будет быстрее - кэш можно ограничить в размере
|
|||
8
Кирпич
31.07.15
✎
11:41
|
(0) да не парься ты. пускай каждый раз ищет. комп то небось не 286
|
|||
9
Сергей Д
31.07.15
✎
11:43
|
(8) 40МГц
|
|||
10
Кирпич
31.07.15
✎
11:45
|
(9) всё равно не парься. бинарный поиск это хорошо.
|
|||
11
Ненавижу 1С
гуру
31.07.15
✎
11:55
|
Можно искать по части массива
Например нашли 101, а теперь ищем 110, тогда искать надо в подмассиве справа длиной не более 110-101=9 элементов |
|||
12
Провинциальный 1сник
31.07.15
✎
11:55
|
(10) Если памяти хватает - можно сделать хэш-таблицу для более быстрого поиска. Разумеется, если хэш-функция будет достаточно удачной и распределение ключей будет равномерным.
|
|||
13
asady
31.07.15
✎
11:56
|
(11) читай (3)
|
|||
14
Сергей Д
31.07.15
✎
11:58
|
(11) Вот я тоже в этом направлении соображал. Видимо нужно будет определить максимальное расстояние, до которого стоит использовать перебор (как вправо, так и влево).
|
|||
15
Кирпич
31.07.15
✎
12:17
|
(14) а элементов в массиве сколько?
|
|||
16
ДенисЧ
31.07.15
✎
12:22
|
если второй номер больше предыдущего - ищи в диапазоне (номер+1)-конце массива.
Если меньше - начало-(номер-1) |
|||
17
Сергей Д
31.07.15
✎
13:10
|
(15) Пока от 100 до 300. В будущем возможно будет и больше.
|
|||
18
Лодырь
31.07.15
✎
13:11
|
А соответствие вам не подойдет? вместо массива?
|
|||
19
Лодырь
31.07.15
✎
13:11
|
(18) а блин. это же паскаль.
|
|||
20
Кирпич
31.07.15
✎
13:33
|
(17) фи. это же фигня. чо прям тормозит на 300 элементах, что ты так озаботился? чота не верится.
|
|||
21
Кирпич
31.07.15
✎
13:37
|
ну будет у тебя допустим 10000 элементов, создай индекс с указателем на каждый сотый элемент. ищи сначала в индексе, потом в массиве. фигня короче. деревья еще какие то выдумал...
|
|||
22
orefkov
31.07.15
✎
15:17
|
(17)
От 100 до 300 на современных компах не будет тормозить, даже если ты будешь делать линейный поиск на каждый поиск. С кэшем поисков не майся - усложнение логики и доп.расход памяти сведёт на нет всю выгоду. Только если заведомо будешь знать, что 90% поисков будут рядом (кстати, как определить "близкость" двух поисков - та еще задача). |
|||
23
Михаил Козлов
31.07.15
✎
17:36
|
(6) Можно простой вариант (АВЛ-дерево)
https://ru.wikipedia.org/wiki/АВЛ-дерево |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |