Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 35

Улучшаем сложность

13.01.2022, 13:17. Показов 1063. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Оптимизируйте пример: улучшите его сложность, не изменяя при этом работу.
Поменяйте только функцию TestPermut.

Подсказка.
Если отсортировать векторы алгоритмом sort, они должны стать равными, иначе элементы в них различны. Поскольку векторы переданы через const &, придётся сортировать копии. Сложность сортировки — это O(N\log N), а сложность сравнения двух векторов — O(N), обе намного лучше N^2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <algorithm>
#include <iostream>
#include <vector>
 
using namespace std;
 
// функция возвращает true, если векторы из одинаковых элементов
// перепишите эту функцию, улучшив её асимптотическую сложность
bool TestPermut(const vector<int>& v1, const vector<int>& v2) {
    // если они разной длины, элементы заведомо разные
    if (v1.size() != v2.size()) {
        return false;
    }
 
    for (int i : v1) {
        // проверяем, что каждый элемент первого вектора
        // содержится одинаковое количество раз в обоих векторах
        if (count(v1.begin(), v1.end(), i) != count(v2.begin(), v2.end(), i)) {
            return false;
        }
    }
 
    return true;
}
 
int main() {
    int n;
    cin >> n;
    vector<int> v1, v2;
    v1.reserve(n);
    v2.reserve(n);
 
    for (int i = 0; i < n; ++i) {
        v1.push_back(rand());
        v2.push_back(rand());
    }
 
    // оба вектора случайны, вряд ли они совпадут
    cout << "Random vectors match? "s << flush;
    cout << (TestPermut(v1, v2) ? "Yes"s : "No"s) << endl;
 
    // делаем один перестановкой другого явным образом
    v2 = v1;
    random_shuffle(v2.begin(), v2.end());
    cout << "Permuted vectors match? "s << flush;
    cout << (TestPermut(v1, v2) ? "Yes"s : "No"s) << endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2022, 13:17
Ответы с готовыми решениями:

Сложность алгоритма
Подскажите пожалуйста, сложность этого алгоритма O(log(n))? #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;chrono&gt; using...

Небольшая сложность
Я создал проект, сохранил, попытался открыть, но на месте отладки появилось &quot;присоединить&quot;, при нажатии которого выдаёт окошко с кучей...

Сложность алгоритма
Здравствуйте, помогите пожалуйста определить сложность алгоритма. #include &quot;pt4.h&quot; #include &quot;iomanip&quot; ...

6
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
13.01.2022, 13:20
dsmkhot, что непонятно? Вроде как во втором абзаце всё написано - сортируем и сравниваем.
0
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 35
13.01.2022, 13:23  [ТС]
Как отсортировать, если векторы переданы через const &?
Просто создать вектор копию и приравнять?
Как то так?
C++
1
2
vector<int> v1_ = v1;
    vector<int> v2_ = v2;
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
13.01.2022, 13:26
Лучший ответ Сообщение было отмечено dsmkhot как решение

Решение

Цитата Сообщение от dsmkhot Посмотреть сообщение
Просто создать вектор копию и приравнять?
Да, об этом написано же.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool TestPermut(const vector<int>& v1, const vector<int>& v2) {
    // если они разной длины, элементы заведомо разные   
    if (v1.size() != v2.size()) {
        return false;
    }
    //можно еще проверить, а не передали ли нам один и тот же вектор
 
    //Поскольку векторы переданы через const &, придётся сортировать копии.
    //    делаем копии
    auto tv1 = v1;
    auto tv2 = v2;
    
    //Если отсортировать векторы алгоритмом sort
    //    сортируем. Каждая сортировка - O(N·log(N))
    std::sort(tv1.begin(), tv1.end());
    std::sort(tv2.begin(), tv2.end());
    
    //они должны стать равными, иначе элементы в них различны.
    //    сравниваем два вектора. Сравнение - O(N)
    return tv1 == tv2;
}
1
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 35
13.01.2022, 13:29  [ТС]
Все так просто, а я if оставлял
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
13.01.2022, 13:34
Цитата Сообщение от dsmkhot Посмотреть сообщение
Все так просто, а я if оставлял
Было два массива:
[1, 4, 5, 3, 4]
[1, 3, 5, 4, 4]
Они содержат одни и те же элементы в одинаковом количестве.
Без сортировки ваш алгоритм проходил по каждому элементу первого массива, и считал сколько всего таких элементов в первом и во втором массиве.
После сортировки массивы (их копии) приняли вид:
[1, 3, 4, 4, 5]
[1, 3, 4, 4, 5]
И их можно просто сравнить.
1
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 35
13.01.2022, 13:59  [ТС]
Да, теперь все понятно, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2022, 13:59
Помогаю со студенческими работами здесь

Сложность алгоритмов
Добрый день, пытаюсь оценить сложность алгоритмов, но возникли сомнения в правильности рассчетов. Собственно рассматриваю два алгоритма -...

Сложность с рекурсией
Нужно написать программу, которая будет вычислять каждый член ряда по формуле, а также их сумму, на рекурсивном возврате. Формула...

Сложность с getline()
Дорогие форумчане! Возникла сложность при использовании getline(). Допустим, у нас есть такой код: int a,b; string s; ...

Неожиданная сложность с read_json()
Всем привет! Возникла следующая непонятка. Через сокет я получаю буфер, содержащий строку...

Сложность бинарного поиска
Добрый вечер, решал данную задачу: Девочка загадала число от 1 до N. За какое наименьшее количество вопросов вида «Загаданное тобой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ноутбук (на замену), о котором я и не подозревал, что он у меня появится.
Programma_Boinc 28.12.2025
Ноутбук (на замену), о котором я и не подозревал, что он у меня появится. Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием "Ноутбук (на замену), о котором я и не. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru