







Задача типичная, и способов решения, простых и сложных очень много.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 TypePrivate 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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5