Я предполагаю, что кеширование относится к кешам ЦП, которые поставляются с предварительным выборщиком, который предсказывает ваш следующий доступ к памяти. Поэтому, если вы выполняете последовательный поиск в массиве, ваш предварительный выборщик распознает шаблон доступа к памяти и загружает память в кэш ЦП, прежде чем ваш ЦП получит к нему доступ. Когда ЦП фактически получает доступ к следующему элементу памяти, он уже находится в кэше и может быть быстро доступен.
Без кеширования и предварительной выборки вашему ЦП пришлось бы ждать, пока контроллер памяти извлечет данные из ОЗУ, что довольно медленно по сравнению с кешем ЦП.
В BST вы не делаете последовательный доступ. В худшем случае ваш BST не находится в смежной памяти, но каждый узел находится в некотором произвольном месте в памяти. Ваш предварительный сборщик не может предсказать это. Затем ЦП должен ждать извлечения каждого элемента из памяти.
А без предварительных загрузчиков касается строки кэша. На x86_64 длина строки кэша составляет 64 байта. Каждое целое число составляет 4 или 8 байт, поэтому вы можете сканировать 16 или 8 записей массива на строку кэша. Первый доступ к ячейке памяти извлекает всю строку, поэтому вы платите доступ к памяти только один раз за 8 сравнений.
Для BST применяется тот же аргумент, что и выше. Память узла, скорее всего, находится не в одной строке кэша, поэтому для каждого сравнения приходится обращаться к памяти.
Подводя итог: A) Доступ к памяти занимает значительно больше времени, чем сравнение; Б) если поиск по массиву или BST быстрее, зависит от количества элементов.