Прежде всего, вы должны понимать, что без RandomAccess
интерфейса binarySearch
не может просто получить доступ к случайному элементу из списка, но вместо этого он должен использовать итератор. Это вводит O(n)
стоимость. Когда в коллекции реализовано RandomAccess
, стоимость доступа к каждому элементу равна O(1)
и может быть проигнорирована в отношении асимптотической сложности.
Поскольку O(n)
больше O(log n)
, оно всегда будет иметь приоритет над O(log n)
и будет доминировать в сложности. В этом случае binarySearch
имеет ту же сложность, что и простой линейный поиск. Так в чем же преимущество?
Линейный поиск выполняет сравнение O(n)
, в отличие от O(log n)
с binarySearch
без произвольного доступа. Это особенно важно, когда константа перед O(logn)
высока. Говоря простым языком: , когда одиночное сравнение стоит очень дорого по сравнению с продвигающимся итератором . Это может быть довольно распространенным сценарием, поэтому ограничение числа сравнений выгодно. Прибыль!