Задача типичная, и способов решения, простых и сложных очень много.Space писал(а):Есть массив Long чисел, неких ID. Можно ли их связать с массивом других чисел Long (Idx) не используя ни одного перебора по любым массивам (прямая связь)? Т.е. каждому произвольному числу ID соответствует 1 произвольное число Idx - в самом простейшем случае можно открыть массив Long Ubound=максимальное ID и присвоить его элементам соответствующие Idx, НО, такой массив сожрёт нереально много памяти, если ID произвольный. На практике же, ID не произволен, но довольно велик, а имеется весьма небольшой массив этих ID, скажем 1000 элементов, поэтому здесь можно попробовать обойтись без жертв памяти
Операция поиска в сортированном массиве не уступает по скорости поиску в двоичном дереве, зато такой массив экономит память. А важно это, или нет - зависит от имеющейся ситуации.Space писал(а):ANDLL, спасибо. Меняется массив или не меняется, самым быстрым вариантом мне видется построение двоичного дерева по ID, в листья которого будут ложиться Idx. Чем больше будет массив ID, тем больший выигрыш будет давать двоичное дерево в скорости.
Это и есть бинарный поиск.Space писал(а):ты имеешь ввиду поиск половинным методом или как там его?
Если у тебя массив отсортитрован, то при добавлении элемента, его позиция определяется все тем же бинарным поиском, ничего сортировать еще раз не надо.Space писал(а):А время на сортировку при добавлении новых элементов?
Тем более.Space писал(а):Хотя да, у меня добавление новых не так часто, как работа с массивом.
Zenitchik писал(а):Кстати, при какой длине массива появляется преимущество интерполяционного поиска перед бинарным?
Private Type EXAMPLE
ID As Long
Idx As Long
End Type
Private Sub Form_Load()
Dim A1(1000) As EXAMPLE
With A1(66)
.ID = 12
.Idx = 13
End With
Debug.Print A1(66).ID, A1(66).Idx
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4