Как искать k элементов из n элементов за O (k log n) времени? - PullRequest
0 голосов
/ 20 ноября 2019

Мой подход состоял в том, что log n означает, что мы создаем дерево, разделяя массив на 2 набора, пока у нас не будут разделены все элементы, тогда мы будем se, если каждый элемент находится в массиве или нет. В этом подходе временная сложность должна быть O (n log n), потому что последний элемент может быть в последнем листе. Что мне не хватает? Я нашел решение, но не понял его.

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 ноября 2019

Решение, которое вы показываете, не для проблемы, которую вы пытаетесь решить. В их контексте они могут проверить, не загрязнена ли какая-то группа городов тем, что они называют «экспериментом», и хотят знать, как мало экспериментов им нужно, чтобы точно определить, какие города k загрязнены. Это теоретическая ситуация и, скорее всего, подразумевается только как упражнение без применения в реальной жизни.

В действительности вы не можете проверить, содержит ли массив элемент менее чем за O (n) времени в худшем случае, если этот массив не имеет какой-либо структуры (например,сортируется). В частности, вы не можете проверить, содержит ли массив k элементов за O (k log n) время для k = o (n / log (n)) , потому что в этом случае k log n = o (n) . Это, конечно, также означает, что для константы k .

невозможно (но если k того же порядка, что и n , тогда O (k log n) становится O (n log n) , и тогда вы можете прибегнуть к сортировке массива).

Если ваш массив отсортирован, вы можете выполнить k бинарный поиск и достижение этой среды выполнения.

0 голосов
/ 20 ноября 2019

Бинарный поиск использует этот подход:

  1. он принимает упорядоченный массив в качестве ввода
  2. переходит к среднему элементу
  3. , если это элемент, который вы ищетепотому что это все
  4. else:
    • средний элемент <искомый элемент -> к тому же, используя в качестве входного массива правую половину массива
    • средний элемент>поиск элемента -> к тому же, используя в качестве входного массива левую половину массива
  5. Продолжить до тех пор, пока не будет найден элемент или размер массива не будет равен 1

Если массив не отсортирован, вы не сможете найти его в k*log n, по крайней мере, O(n), просто проверяя каждый элемент с нужными

...