Поиск числа в массиве
- Войдите на сайт для отправки комментариев
Ср, 09/12/2020 - 18:12
Есть два одномерных массива чисел к примеру, int arr1[100] = {1, 54.....} и второй аналогичный. Я делаю математические операции с их элементами.
Также есть задача нахождения индекса заданного числа. Я могу сделать это путем цикла, сравнения, и прерывания цикла. Меня не устраивает время выполнения поиска, особенно, если число в конце массива.
Подскажите, какие есть пути решения? Ускорит ли преобразования в строки и применение strstr?
Для быстрого поиска есть деревья и хеш-таблицы.
Также есть задача нахождения индекса заданного числа. Я могу сделать это путем цикла, сравнения, и прерывания цикла. Меня не устраивает время выполнения поиска, особенно, если число в конце массива.
чтобы время выполнения такого поиска заметно сказывалось на всей программе - он должен быть или очень криво написан, или почему-то выполнятся сотни раз подряд
Может покажете код, а то что-то непонятно, где там у вас может быть затык
Есть два одномерных массива чисел к примеру, int arr1[100] = {1, 54.....} и второй аналогичный. Я делаю математические операции с их элементами.
Также есть задача нахождения индекса заданного числа. Я могу сделать это путем цикла, сравнения, и прерывания цикла. Меня не устраивает время выполнения поиска, особенно, если число в конце массива.
Подскажите, какие есть пути решения? Ускорит ли преобразования в строки и применение strstr?
если число в конце массива хорошо справится шейкерный метод
если число в конце массива хорошо справится шейкерный метод
если число в конце массива - надо искать с конца!
он должен быть или очень криво написан, или почему-то выполнятся сотни раз подряд
Написан конечно криво... я только учусь)))
Счас вы подсказали, что производительности должно хватить на все с гаком.... поэтому ищу косяк в другом месте.
Так... массивы заполняются динамически с СОМ порт. Подскажите, плз, терминальную программу, которая может посылать НЕПРЕРЫВНО коды, которые я ввел в окно. ОФ...топик(((
Что-то я не заметил, чтобы в теме было написано что есть "всё", чтобы знать, что производительности хватит на "всё"
Есть два одномерных массива чисел...
Также есть задача нахождения индекса заданного числа.
если число в конце массива хорошо справится шейкерный метод
Это как?
Есть два одномерных массива чисел...
Также есть задача нахождения индекса заданного числа.
если число в конце массива хорошо справится шейкерный метод
Это как?
кто у нас тут программисты?... обязаны знать )))
результат в терминале:
52 микросекунды это много?
52 мкс для этого - довольно много
Макс, а если в 11 строчке размер не вычислять, а записать явно?
все равно 52
если массив int то 72 мкс, а если инкремент в цикле фор тоже сделать int то 88 мкс
все равно 52
да, точно... компилятор сам это заменяет при оптимизации...
а так?
я тоже думал, что так будет быстрее и уже попробовал , все равно 52)) Понятно, что в реале поиск чуть меньше времени занимает, т.к. измерение времени поиска и распечатка тоже занимает время. Но, я думаю, может микросекунд на 5 поменьше.
ну да, я тоже уже попробовал... :)
И через указатели вместо массива.. та же цифра с точностью до мкс.
Удивительная стабильность.
результат в терминале:
52 микросекунды это много?
конечно много, если всего одна строчка и можно сделать за 4 микросекунды )))
а если число в середине окажется? )) ну все равно чуть быстрее: 44 мкс.
а если число в середине окажется? )) ну все равно чуть быстрее: 44 мкс.
ну да, только твой первый код находил 50-й элемент быстрее :)
а если число в середине окажется? )) ну все равно чуть быстрее: 44 мкс.
да, но в этом случае если не применять шейкер, то оно найдётся быстрее, за
28 microsec
Index45 = 49
Тема обсосана мной лет 25 назад, в не сортированном массиве выигрывает быстрый поиск
нифига подобного, проверил, закомментировал цикл фор. Показывает 0 мкс. Поэтому всё точно вплоть до 1 мкс.
28 microsec
Index45 = 49
Тема обсосана мной лет 25 назад, в не сортированном массиве выигрывает быстрый поиск
не ну это повезло, мыж за максимальное время боремся, чтоб оно минимально было))
28 microsec
Index45 = 49
Тема обсосана мной лет 25 назад, в не сортированном массиве выигрывает быстрый поиск
не ну это повезло, мыж за максимальное время боремся, чтоб оно минимально было))
ждёмс, кто сподвигнется дописать быстрый поиск, мне в лом, я и не программист...мне книжку надо найти...открыть ...и алгоритм перенести в скетч )))
PS метод половинного деления тоже проигрывает
52 микросекунды на обработку 100 элементов - это по 8 тактов на элемент.
а если число в середине окажется? )) ну все равно чуть быстрее: 44 мкс.
Строго говоря, сразу надо уменьшать длину цикла вдвое (11 строка).
А выигрыш за счет того, что за проход цикла проверяется не 1, а 2 элемента. Меньше накладные расходы на организацию цикла. Если в цикле проверять по 10 элементов, будет еще быстрее.
Собственно, расчет примерно такой:
- проверка окончания цикла - 2 такта,
- проверка, сравнение и переход - 6 тактов,
Если в цикле 1 сравнение - 8 тактов, если 2 сравнения - 14 тактов, но самих циклов вдвое меньше.
да, но в этом случае если не применять шейкер, то оно найдётся быстрее, за
28 microsec
Index45 = 49
Тема обсосана мной лет 25 назад, в не сортированном массиве выигрывает быстрый поиск
Нету никакого быстрого поиска. Шейкер - это метод сортировки, а не поиска.
ждёмс, кто сподвигнется дописать быстрый поиск, мне в лом, я и не программист...мне книжку надо найти...открыть ...и алгоритм перенести в скетч )))
Фикция все это.
Поиск в неотсортированном массиве О(n). Быстрее не получится.
это похоже на разгон процессора под жидким азотом, только ради результата. Неужели эта цифра действительно большая ? ну что в нашем мире 52 мкс для любительского хобби? я delay по 100 200 мс, иногда не стремаюсь ставить в своих проектах.
это похоже на разгон процессора под жидким азотом, только ради результата. Неужели эта цифра действительно большая ? ну что в нашем мире 52 мкс для любительского хобби?
а вот когда обсчитывать надо 3 дома услуги ЖКХ на 286 машине и между расчётами тебе наливают, можно спиться, если не оптимизировать )))
Собственно, листинг цикла:
В регистре r28 у нас переменная цикла i, а в регистр r24 мы загружаем очередной элемент массива. Остальное, думаю, понятно: по адресу 610 сравниваем число с 45 и, если сравнение увенчалось успехом, следующим оператором покидаем цикл. По адресу 614 инкремент переменной цикла (сделан любопытно: i -= 255;), 616 - проверка на окончание цикла.
я тоже думал, что так будет быстрее и уже попробовал , все равно 52)) Понятно, что в реале поиск чуть меньше времени занимает, т.к. измерение времени поиска и распечатка тоже занимает время. Но, я думаю, может микросекунд на 5 поменьше.
Вроде как вывод одного символа в порт занимает 16мкс.
Так что не на 5.
я тоже думал, что так будет быстрее и уже попробовал , все равно 52)) Понятно, что в реале поиск чуть меньше времени занимает, т.к. измерение времени поиска и распечатка тоже занимает время. Но, я думаю, может микросекунд на 5 поменьше.
Во-первых, вывод в порт в подсчет времени не входит, а во-вторых, Serial.print() не выводит символ в порт, а лишь помещает его в буфер вывода, что намного бысрее.
не, вывод ведь не влияет, если скетч внимательно посмотреть. Тем более я проверил, и микрос тоже не влияет.
нифига подобного, проверил, закомментировал цикл фор. Показывает 0 мкс. Поэтому всё точно вплоть до 1 мкс.
Ну, детские ошибки-то исправьте!
1. за границы массива-то не надо вылазить!
2. Вы в цикле сравниваете с начала и с конца, но при этом нафига-то идёте черезь весь массив! Т.е. если искомого элемента в массиве нет, то Вы каждый элемент сравните с 45 ДВАЖДЫ!
3. В ограничении цикла нельзя использовать sizeof - это сработает только при байтовом массиве чисто по совпадению. При любом другом типе (int, long) всё повалится нахрен.
По адресу 614 инкремент переменной цикла (сделан любопытно: i -= 255;), 616 - проверка на окончание цикла.
интересно почему так?
Не знаю.
В принципе, для байта "i++;" и "i -=255;" - это одно и то же. Может автор дизассемблера так самовыразился. А может - чтобы флаги состояния после операции правильно расставились. Я не силен в системе команд AVR.
Ну, детские ошибки-то исправьте!
тут народ почему-то не знает, что такое шейкер, писал не мудрствуя лукаво и на ошибки забил )))
так видимо будет правильней:
кстати, даже для самого тяжёлого случая поиск занимает 48 микросекунд на ниже приведённом скетче, может покажете быстрый поиск?
Да напиши уж сразу все сто сравнений на if, гений программирования блин.
кстати, даже для самого тяжёлого случая поиск занимает 48 микросекунд на ниже приведённом скетче, может покажете быстрый поиск?
Быстрого поиска по неупорядоченному массиву не существует. Нужно либо сортировать массив, либо использовать деревья. В любом случае O(log(N)).
Но Вы на правильном пути:
Да напиши уж сразу все сто сравнений на if, гений программирования блин.
а пальцем показать сможешь? или ты всё языком?
получается, что компилятор реализует функцию весьма эффективно, на ассемблере это было бы
приблизительно 5-8 инструкций, то-есть 35-56 микросекунд приблизительно, переводом на ассемблер
не решить задачу, остаётся только алгоритм...
Тому кто технарям ставит задачу по ЖКХ и даёт 286 машины надо в рот насрать.
Тому кто технарям ставит задачу по ЖКХ и даёт 286 машины
так дело давно было, на заре автоматизации )))
получается, что компилятор реализует функцию весьма эффективно, на ассемблере это было бы
приблизительно 5-8 инструкций
Ассемблерный листинг был размещен в сообщении №29.
Так что, кто умеет читать - читает, а кто не умеет - гадает, сколько это приблизительно могло бы быть.
получается, что компилятор реализует функцию весьма эффективно, на ассемблере это было бы
приблизительно 5-8 инструкций
Ассемблерный листинг был размещен в сообщении №29.
Так что, кто умеет читать - читает, а кто не умеет - гадает, сколько это приблизительно могло бы быть.
вот это что ли?
конечно не умею, не вижу тут размерности массива, совсем...
посмотрел внимательней, сделано через взад, а чё, так тоже можно, особенно в свете общемировых тенденций...
посмотрел внимательней, сделано через взад, а чё, так тоже можно, особенно в свете общемировых тенденций...
subi r28,ff и inc r28 оба занимают 2 байта, как любая команда, выполняются ОДИН так и делают ОДНО И ТОЖЕ. Только SUBI больше флагов выставляет. Поэтому компилятор её и предпочитает. Нет аргументов в пользу inc, кроме "читаемости человеком". Как ты думаешь, компилятору важна "читаемость" человеком его кода? ;))))
посмотрел внимательней, сделано через взад, а чё, так тоже можно, особенно в свете общемировых тенденций...
subi r28,ff и inc r28 оба занимают 2 байта, как любая команда, выполняются ОДИН так и делают ОДНО И ТОЖЕ. Только SUBI больше флагов выставляет. Поэтому компилятор её и предпочитает. Нет аргументов в пользу inc, кроме "читаемости человеком". Как ты думаешь, компилятору важна "читаемость" человеком его кода? ;))))
я учил ассемблер по книге Питера Нортона, меня не переделать уж
я учил ассемблер по книге Питера Нортона, меня не переделать уж
Долго думал, что в ответ написать. Ничего кроме:
--Возьми с полки порожок!
не пришло в голову! ;)))
посмотрел внимательней, сделано через взад, а чё, так тоже можно, особенно в свете общемировых тенденций...
subi r28,ff и inc r28 оба занимают 2 байта, как любая команда, выполняются ОДИН так и делают ОДНО И ТОЖЕ. Только SUBI больше флагов выставляет. Поэтому компилятор её и предпочитает. Нет аргументов в пользу inc, кроме "читаемости человеком". Как ты думаешь, компилятору важна "читаемость" человеком его кода? ;))))
я учил ассемблер по книге Питера Нортона, меня не переделать уж
А я по Питеру Абелю. Чье кунфу сильнее? :-)
А я по Питеру Абелю. Чье кунфу сильнее? :-)
скорее твоё, тогда у процессора уровней ещё небыло