У меня есть массив целых чисел, которые могут встречаться в сотнях тысяч (или более), отсортированных по возрастанию, так как они были изначально сложены.
Мне нужно иметь возможность запросить массив кполучить индекс его первого появления числа >=
некоторого ввода, настолько эффективно, насколько это возможно.Единственный способ узнать, как это сделать, даже не задумываясь об этом, - это перебирать массив, проверяя условие, пока оно не вернет true, и тогда я перестану перебирать.Однако это самое дорогое решение этой проблемы, и я ищу лучший алгоритм для ее решения.
Я пишу код в Objective-C, но я приведу пример для расширения в JavaScriptаудитория людей, которые могут ответить.
// Sample set
var numbers = [1, 7, 23, 23, 23, 89, 1002, 1003];
var indexAfter100 = getIndexOfValueGreaterThan(100);
var indexAfter7 = getIndexOfValueGreaterThan(7);
// (indexAfter100 == 6) == true
// (indexAfter7 == 2) == true
Помещение этих данных в БД для выполнения этого поиска будет только последним средством, так как я стремлюсь увидеть какой-то алгоритмчтобы быстро решить эту проблему в памяти.
Я могу иметь возможность изменить структуру данных или сохранить дополнительную структуру данных, когда я строю массив, так как моя программа ужепоместил каждое число одно за другим в этот стек, так что я бы просто изменил код, который добавляет их в стек.Поиск индекса по мере его добавления в стек невозможен, так как операция поиска будет часто повторяться с разными значениями после факта.
Сейчас я думаю "B-Tree", ноесли честно, я бы понятия не имел, как его реализовать, и прежде чем я уйду и начну разбираться с этим, мне интересно, есть ли хороший алгоритм, который лучше подходит для этого единственного варианта использования?