Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поиск формулы для нахождения индекса элемента массива
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Sprite
Доброго всем времени суток!

Есть таблица элементов (скажем частот), в котором каждое последующее значение отличается от предыдущего на 1%, например:
Код
10000
10100
10201
10303,01
10406,0401
10510,1005
10615,20151
10721,35352
и т.д.


и есть текущее значение частоты, например 10354.

Нужно частотам (как бы это по русски выразиться wacko.gif ) присвоить "индексы", например: если текущее значение лежит в диапазоне от 10000 до 10099 - то индекс = 0, при текущем значении в диапазоне от 10100 до 10200 - индекс = 1, при значении = 10477 индекс = 4 и т.д.
Самое тривиальное что приходит в голову - это проход по всей таблице и банальное сравнение, но этот вариант не подходит - слишком много времени тратится. Можно ли нахождение индекса представить в виде формулы?

Прошу прощения если вопрос не в тему и не по адресу.
_pv
100.5 * log(x/10000)

но в зависимости от размера таблицы, может оказаться что бинарным поиском будет быстрее чем логарифм считать, особенно если речь про какой-нибудь 8ми битный контроллер
twix
Внимание вопрос, простое сравнение значит долго будет вычисляться, а логарифм при помощи рядов и деление быстро.
Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.
10723 - 10000 = 723 /100 = 7
Если в микроконтроллере здесь быстрая процедура деления на 10 http://forum.easyelectronics.ru/viewtopic....f=4&t=13470
Sprite
Цитата(twix @ Apr 4 2018, 21:49) *
Внимание вопрос, простое сравнение значит долго будет вычисляться, а логарифм при помощи рядов и деление быстро.
Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.
10723 - 10000 = 723 /100 = 7
Если в микроконтроллере здесь быстрая процедура деления на 10 http://forum.easyelectronics.ru/viewtopic....f=4&t=13470

Спасибо большое, дружищще! 08.gif Микроконтроллер stm, операция деления и вычитания в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.
_pv
Цитата(twix @ Apr 4 2018, 20:49) *
Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.10723 - 10000 = 723 /100 = 7

это будет работать если только в таблице меньше 15 частот, дальше будут ошибки.
вычисление логарифма не такое и медленное, несколько десятков тактов.
Sprite
Цитата(_pv @ Apr 4 2018, 22:15) *
это будет работать если только в таблице меньше 15 частот, дальше будут ошибки.
вычисление логарифма не такое и медленное, несколько десятков тактов.

Вы правы) Поторопился я немного с выводом.
twix
Ну да, но зато вы можете применить быстрые вычисления логарифмов, и решить вопрос с минимальными потерями.
megajohn
Цитата(Sprite @ Apr 4 2018, 18:02) *
в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.


забыли про метод половинного деления ( или как правильно называется ? )
k155la3
Цитата(megajohn @ Apr 5 2018, 12:01) *
забыли про метод половинного деления ( или как правильно называется ? )

Та нее, все "под контролем" : _pv, бинарный поиск

sigmaN
Я бы тоже бинарным поиском искал и не парился.
Ведь значения в массиве отсортированы уже по условию задачи.
_pv
Цитата(sigmaN @ Apr 6 2018, 13:47) *
Я бы тоже бинарным поиском искал и не парился.
Ведь значения в массиве отсортированы уже по условию задачи.

ну не хранить же весь массив в памяти для этого, а вместо того чтобы на каждом шаге поиска считать 1.01^N, один раз вычислить логарифм будет куда быстрее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.