Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

178 Глава 4. Аналитические инструменты

Дальнейший анализ считающего максимальный алгоритма

Более интересный вопрос, относительно вышеупомянутого считающего максимальный алгоритма,

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

выполненный n- 1 раз, следовательно O (n) времена.

Но что, если входное множество дано нам в случайном заказе со всеми заказами одинаково

вероятно; каково было бы ожидаемое количество раз, мы обновили максимальное значение в этом случае? Чтобы ответить на этот вопрос, обратите внимание на то, что мы обновляем текущий максимум в ith повторении, только если ith элемент во множестве больше, чем все элементы, которые предшествуют ему. Но если множество дано нам в случайном заказе, вероятность, что ith элемент больше, чем все элементы, которые предшествуют, это - 1/i; следовательно, ожидаемым количеством раз, мы обновляем максимум в этом случае, является Hn =ån=1 1/i, который является мной

известный как энное Гармоническое число. Это оказывается (см. Суждение 16), что Hn - O (зарегистрируйте n). Поэтому, ожидаемое количество раз, максимум обновлен, когда вышеупомянутым считающим максимальный алгоритмом управляют на случайном множестве, является O (зарегистрируйте n).

Несвязность набора с тремя путями

Предположим, что нам дают три набора, A, B, и C, с этими наборами, сохраненными в трех различных

множества целого числа, a, b, и c, соответственно. Проблема несвязности набора с тремя путями состоит в том, чтобы определить, несвязные ли эти три набора, то есть, нет ли никакого элемента x

таким образом, что xÎ A, xÎ B, и xÎ C. Простой C ++ функционирует, чтобы определить эту собственность

дан ниже:

bool areDisjoint (константа vector<int>& a, константа vector<int>& b,

константа vector<int>& c)

для (интервал i = 0; я <a.size (); я ++)

для (интервал j = 0; j <b.size (); j ++)

для (интервал k = 0; k <c.size (); k ++)

если (([я] == b [j]) && (b [j] == c [k])) ложное возвращение;

возвратитесь верный;

Эти простые петли алгоритма через каждого возможного трижды индексов i, j и k, чтобы проверить, равны ли соответствующие элементы, внесенные в указатель в a, b, и c. Таким образом, если каждое из этих множеств имеет размер n, то продолжительность худшего случая этой функции - O (n3). Кроме того, худший случай достигнут, когда наборы несвязные, так как в этом случае мы проходим весь n3, утраивается действительных индексов, меня, j, и k. Такую продолжительность обычно не считали бы очень эффективной, но, к счастью, есть лучший способ решить эту проблему, которую мы исследуем в Упражнении C-4.3.