2015-02-08 1 views
4

Я новичок здесь. Будучи студентом-градиентом, я некоторое время занимаюсь мозговым штурмом по алгоритмам. Я ценю любую помощь, которая может быть расширена в отношении проблемы ниже. Я искал достаточно, и я не мог найти никакого близкого решения этой проблемы.Разделите и покорите алгоритмы (применение бинарного поиска ?!)

У нас есть массив отсортированных различных чисел, который бесконечно длинный. Первые n чисел являются дробями, которые больше 0, но меньше 1. Все остальные элементы равны «1», и вам не присваивается значение n. Вам нужно разработать алгоритм, чтобы проверить, имеется ли в этом массиве заданная пользователем фракция F. Проанализируйте временную сложность алгоритма как функцию n. (Пример для n = 8, где 1 начинается с 8-го положения массива)

Мой подход: Я предполагаю, что лучший способ решить это - использовать двоичный поиск. Каждый раз, когда мы можем уменьшить размер массива наполовину и, наконец, придем к найденной части. Предположим, что в массиве есть m элементов, включая 1. Число дробных элементов равно n. Сложность выполнения бинарного поиска по всему массиву равна O (log (m)). Поскольку меня просят выразить временную сложность в терминах n, m = n + k (при условии, что число 1 в массиве равно k) Таким образом, временная сложность этой проблемы равна O (log (n + k)) ,

Пожалуйста, бросьте свои мысли. Спасибо

+1

«У нас есть массив отсортированных различных чисел, который бесконечно длинный». Остановись прямо там. Оставьте факультет информатики прямо сейчас и пойдите в математический отдел по соседству. –

+0

@MikeNakis Почему? Некоторый алгоритм компьютерной науки должен принимать несвязанные значения. – ElderBug

+4

Вы не можете иметь массив бесконечной длины. Вы можете говорить о бесконечном потоке предметов, но не о бесконечном массиве. И, конечно, вы не можете выполнять бинарный поиск в потоке, потому что вам нужно знать общее количество элементов, чтобы вы могли вычислять середину и т. Д. И т. Д. –

ответ

8

Вы действительно можете решить это для бесконечного массива, т. Е. Не зная m, экспоненциальным поиском.

Попробуйте первый элемент и удвоьте индекс, пока не получите 1. Это займет шаги O (Lg n). Затем вы переключаетесь на двоичный поиск и получаете ответ на дополнительные шаги O (Lg n).

Значение k не имеет значения.

Этот подход может иметь смысл в реальном мире, т. Е. С массивом конечного, но неизвестного размера, при условии, что по крайней мере половина массива заполнена единицами, так что поиск завершается в границах.

+0

На практике вы даже не перейдет к 1 в экспоненциальном поиске, только к первому элементу, который является> F. И вы должны сделать только двоичный поиск между этой позицией и предыдущей. Конечно, это не влияет на худшую временную сложность, но это может дать вам лучший средний случай. – biziclop

+0

Спасибо. Делает смысл :) – whyme

+0

@biziclop: справа. Сложность на самом деле O (Lg i), где i - индекс искомого элемента.Кроме того, я не сказал, что бинарный поиск должен был быть сделан из первого элемента :), но эта оптимизация не улучшает средний случай, все еще O (Lg n) или O (Lg i), он только сохраняет один тест , –