Перейти к содержанию
    

Поиск формулы для нахождения индекса элемента массива

Доброго всем времени суток!

 

Есть таблица элементов (скажем частот), в котором каждое последующее значение отличается от предыдущего на 1%, например:

10000
10100
10201
10303,01
10406,0401
10510,1005
10615,20151
10721,35352
и т.д.

 

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

 

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

Самое тривиальное что приходит в голову - это проход по всей таблице и банальное сравнение, но этот вариант не подходит - слишком много времени тратится. Можно ли нахождение индекса представить в виде формулы?

 

Прошу прощения если вопрос не в тему и не по адресу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

100.5 * log(x/10000)

 

но в зависимости от размера таблицы, может оказаться что бинарным поиском будет быстрее чем логарифм считать, особенно если речь про какой-нибудь 8ми битный контроллер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внимание вопрос, простое сравнение значит долго будет вычисляться, а логарифм при помощи рядов и деление быстро.

Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.

10723 - 10000 = 723 /100 = 7

Если в микроконтроллере здесь быстрая процедура деления на 10 http://forum.easyelectronics.ru/viewtopic....f=4&t=13470

Изменено пользователем twix

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внимание вопрос, простое сравнение значит долго будет вычисляться, а логарифм при помощи рядов и деление быстро.

Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.

10723 - 10000 = 723 /100 = 7

Если в микроконтроллере здесь быстрая процедура деления на 10 http://forum.easyelectronics.ru/viewtopic....f=4&t=13470

Спасибо большое, дружищще! :08: Микроконтроллер stm, операция деления и вычитания в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.10723 - 10000 = 723 /100 = 7

это будет работать если только в таблице меньше 15 частот, дальше будут ошибки.

вычисление логарифма не такое и медленное, несколько десятков тактов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это будет работать если только в таблице меньше 15 частот, дальше будут ошибки.

вычисление логарифма не такое и медленное, несколько десятков тактов.

Вы правы) Поторопился я немного с выводом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем twix

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.

 

забыли про метод половинного деления ( или как правильно называется ? )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

забыли про метод половинного деления ( или как правильно называется ? )

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы тоже бинарным поиском искал и не парился.

Ведь значения в массиве отсортированы уже по условию задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы тоже бинарным поиском искал и не парился.

Ведь значения в массиве отсортированы уже по условию задачи.

ну не хранить же весь массив в памяти для этого, а вместо того чтобы на каждом шаге поиска считать 1.01^N, один раз вычислить логарифм будет куда быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...