2010-10-24 2 views
2

У меня есть массив целых чисел, который может набирать сотни тысяч (или больше), отсортированных по возрастанию, так как они были изначально сложены.Нужно ли мне реализовать поиск по дереву?

Мне нужно иметь возможность запросить массив, чтобы получить индекс его первого вхождения числа >= с некоторым вводом, насколько это возможно. Единственный способ, которым я мог бы это сделать, даже не думая об этом, - это перебрать массив, проверяющий условие до тех пор, пока он не вернет 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 

Ввод этих данных в БД, чтобы выполнить этот запрос будет только последним средством решения, так как я заинтересован, чтобы увидеть какой-то алгоритм для решения этой быстро в памяти.

У do есть возможность изменить структуру данных или сохранить дополнительную структуру данных при создании массива, так как моя программа уже вытолкнула каждый номер один за другим в этот стек, d просто измените код, добавляющий их в стек. Поиск индекса по мере добавления в стек невозможно, так как операция поиска будет повторяться часто с разными значениями после факта.

Сейчас я думаю «B-Tree», но, честно говоря, я бы понятия не имел, как реализовать его, и до того, как я уйду и начну понимать это, интересно, есть ли хороший алгоритм, который подходит для этого один вариант использования лучше?

ответ

7

Вы должны использовать binary search. Цель C может даже иметь встроенный метод для этого (многие языки, которые я знаю). B-tree, вероятно, мало поможет, если вы не хотите хранить данные на диске.

+0

Спасибо. Читая это сейчас. – d11wtq

+0

Это так просто, и это именно тот алгоритм, который я искал, спасибо. Теперь я просто пинаю себя, что это не появилось в моей голове несколько часов назад! :П – d11wtq

1

Быстрый алгоритм поиска должен иметь возможность обрабатывать массив значений такого размера, не занимая слишком много времени, я должен подумать (и массив отсортирован, поэтому бинарный поиск, вероятно, станет для вас способом).

Я думаю, что ВТКЕЕ вероятно, слишком много ...

2

Я не знаю о Objective-C, но C (обычная «ол C) поставляется с функцией называется bsearch (кроме того, AFAIK, Obj-C может вызывать функции C просто отлично):

http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/

это в основном делает бинарный поиск, который звучит, как это то, что вам нужно.

0

Поскольку они сортируются в определенном порядке ASCending, и вам нужны только более крупные, я бы сериализовал этот массив, взорвал его INT и сохранил часть сериализованной строки, которая содержит более крупные INT, а затем несериализует ее и вуаля.

0

Линейный поиск, также называемый последовательным поиском, последовательно смотрит на каждый элемент в последовательности, чтобы увидеть, присутствует ли требуемый элемент в структуре данных. Когда количество данных невелико, этот поиск выполняется быстро. Он прост, но требуемая работа пропорциональна количеству данных для поиска. Удвоение количества элементов удваивает время поиска, если нужный элемент отсутствует.

Бинарный поиск эффективен для больших массивов. В этом случае мы проверяем средний элемент.Если значение больше того, что мы ищем, тогда посмотрите в первом тайме, иначе посмотрите во второй половине. Повторяйте это до тех пор, пока не будет найден нужный элемент. Таблица должна быть отсортирована для двоичного поиска. Он исключает половину данных на каждой итерации. Его логарифмический