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

Оптимизация линейного поиска

08.02.2021, 15:21. Показов 3973. Ответов 35
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, хотел спросить, каким методом лучше оптимизировать линейный поиск. И считается ли оптимизацией поиск с двух сторон? Вроде этого:
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
srand(time(NULL));
const int SIZE = 40;
 
int key; // from user
int count = 0;
 
int arr[SIZE]; // array
int indices[SIZE] = {};
 
for (int i = 0; i < SIZE; ++i)
{
    arr[i] = rand() % 30;
}
 
cout << "\n\nEnter your key: ";
cin >> key;
 
for (int i = 0, j = SIZE - 1; i < SIZE / 2, j >= SIZE / 2; ++i, --j)
{
    if (arr[i] == key)
    {
        indices[count] = i;
        count++;
    }
        
    if (arr[j] == key)
    {
        indices[count] = j;
        count++;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2021, 15:21
Ответы с готовыми решениями:

Оптимизация кода (решение линейного уравнения)
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида a+x=b x+a=b a+b=x Тоесть пишешь например:...

Алгоритм линейного поиска
Здорова, в чем проблема данной функции? почему алгоритм не срабатывает? Когда пишу отдельно все прекрасно работает #include...

алгоритм линейного поиска заданного ключа
как то странно считает номер...или я что-то не дописал ((( #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; const...

35
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.02.2021, 20:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
Там из Compiler Explorer есть ссылка на бенчмарк, по которой можно перейти и потестить код.

Кланг кстати быстрее выполняет код!)

https://quick-bench.com/q/5Pqe... hek5CgJcOQ

Надо выкинуть ГЦЦ

....

Ну вот, теперь ещё компилятор надо учитывать, на каком быстрее будет выполняться.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.02.2021, 20:50
да там код прямой как доска, нечего там оптимизировать...
хотя возможно преподаватель уверен что через указатели будет быстрей чем индексацией , я хз

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Есть еще Алгоритм Гровера
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
08.02.2021, 20:53
вы маньяки.
Кликните здесь для просмотра всего текста
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.02.2021, 20:54
Цитата Сообщение от Verevkin Посмотреть сообщение
Многопоточностью.
Ну разве что до количества ядер, больше потоков тоже не поможет.
Потому как находятся все значения а не первое. Все равно надо все перебрать.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 20:57
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому как находятся все значения а не первое. Все равно надо все перебрать.
В смысле? Каждый поток перебирает только свой кусок массива. Соответственно, скорость увеличится пропорционально количеству ядер/процессоров.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.02.2021, 21:19
Цитата Сообщение от SmallEvil Посмотреть сообщение
через указатели будет быстрей
На кол его, если он так думает. Быстрее точно не будет, ибо получиться тоже самое.
0
3123 / 1712 / 273
Регистрация: 19.02.2010
Сообщений: 4,495
08.02.2021, 21:31
Цитата Сообщение от OpXiv Посмотреть сообщение
Его вообще будет ещё медленнее, потому что каждый цикл FOR он выполняет 2 раза операцию деления на 2
Компиляторы давно уже умеют оптимизировать константные выражения прямо на этапе компиляции. Т.е. из SIZE / 2 компилятор сделает (и будет использовать) новую константу ==> делений на этапе выполнения не будет вообще.
Также компиляторы давно уже заменяют /2 на быструю операцию сдвига на один бит вправо - это если у ТСа при переделке кода SIZE станет переменной, а не константой.

Цитата Сообщение от OpXiv Посмотреть сообщение
Его мега крутая
Ну и где там команды деления?
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.02.2021, 21:39
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Ну и где там команды деления?
Как бы там не было, мой вариант работает за 64 секунды. Его вариант работает за 103
https://quick-bench.com/q/5Pqe... hek5CgJcOQ

Это на 39 медленнее. От как
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 21:42
Цитата Сообщение от OpXiv Посмотреть сообщение
Как бы там не было, мой вариант работает за 64 секунды. Его вариант работает за 103
Я вроде здесь уже, как минимум, дважды сказал, что его вариант плохой. Все уже давно поняли, кроме тебя.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.02.2021, 21:42
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Все уже давно поняли, кроме тебя.
Я изначально говорил что его вариант плохой. Ты что - то путаешь.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
08.02.2021, 21:46
Цитата Сообщение от OpXiv Посмотреть сообщение
Ну вот, теперь ещё компилятор надо учитывать, на каком быстрее будет выполняться.
Ты бы хоть посмотрел, какую оптимизацию сделал clang Он в одном проходе сразу по два элемента из массива загружает.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.02.2021, 21:48
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты бы хоть посмотрел, какую оптимизацию сделал clang
Посмотрел. Увидел что, если не стараться писать оптимизации, компилятор за тебя сделает оптимизацию. И сделает это гораздо лучше.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 21:50
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты бы хоть посмотрел, какую оптимизацию сделал clang Он в одном проходе сразу по два элемента из массива загружает.
Кстати, а ведь я говорил
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ещё, наверное, можно считать сразу два элемента твоего массива в 64-битную локальную переменную и сравнить её половины с ключом. По идее должно будет быстрее отрабатывать, во всяком случае на x64
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
08.02.2021, 22:19
Цитата Сообщение от OpXiv Посмотреть сообщение
Увидел что, если не стараться писать оптимизации, компилятор за тебя сделает оптимизацию. И сделает это гораздо лучше.
Это правильно. Но такую оптимизацию можно и самому сделать.
Для такого цикла, например, получим тот же самый код
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < SIZE; i += 2)
{
    if (arr[i] == key)
    {
        indices[count] = i;
        count++;
    }
    if (i < SIZE - 1 && arr[i + 1] == key)
    {
        indices[count] = i + 1;
        count++;
    }
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 22:29
Цитата Сообщение от zayats80888 Посмотреть сообщение
Для такого цикла, например, получим тот же самый код
Разве тот же? Мне казалось, что здесь должно быть что-то наподобие
C++
1
2
3
4
for (int i = 0; i < SIZE / 2; ++i)
{
    uint64_t x = reinterpret_cast<uint64_t *>(arr)[i];
         //if (low(x) == key || high(x) == key)
Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
i < SIZE - 1
А это должно проверятся один раз после цикла, а не на каждой итерации
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
08.02.2021, 23:39
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну разве что до количества ядер, больше потоков тоже не поможет.
Потому как находятся все значения а не первое. Все равно надо все перебрать.
Посмотри это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2021, 23:39

Реализовать функцию линейного поиска элемента в массиве
1) Реализовать функцию линейного поиска элемента в массиве (принимает массив и искомое значение(ключ), возвращает индекс найденного...

Проверка времени выполнения алгоритма линейного поиска
Имею вот такой код: #include &lt;random&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;windows.h&gt; int findElement(int* array,...

Написать generic функцию линейного поиска в массиве
Предложите ваши варианты решения заданий 5. Имеем чистый C. Напишите generic функцию линейного поиска в массиве. И приведите пример...

Алгоритм линейного поиска числа в массиве!(Кормен)
Всем привет в книге Томас Х. Кормен Алгоритмы. Вводный курс (2014) есть пару строчек непонятных мне...:( Вот я и решил обратится к...

Оптимизация функции поиска
Есть функция поиска номеров по шаблону, шаблон задает пользователь. Пример ввода: 097???????. Надо сделать так, чтоб при вводе (097???????...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru