реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поиск формулы для нахождения индекса элемента массива, Нужна помощь математика)
Sprite
сообщение Apr 4 2018, 14:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



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

Есть таблица элементов (скажем частот), в котором каждое последующее значение отличается от предыдущего на 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 и т.д.
Самое тривиальное что приходит в голову - это проход по всей таблице и банальное сравнение, но этот вариант не подходит - слишком много времени тратится. Можно ли нахождение индекса представить в виде формулы?

Прошу прощения если вопрос не в тему и не по адресу.
Go to the top of the page
 
+Quote Post
_pv
сообщение Apr 4 2018, 14:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



100.5 * log(x/10000)

но в зависимости от размера таблицы, может оказаться что бинарным поиском будет быстрее чем логарифм считать, особенно если речь про какой-нибудь 8ми битный контроллер
Go to the top of the page
 
+Quote Post
twix
сообщение Apr 4 2018, 14:49
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 4-11-15
Пользователь №: 89 174



Внимание вопрос, простое сравнение значит долго будет вычисляться, а логарифм при помощи рядов и деление быстро.
Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.
10723 - 10000 = 723 /100 = 7
Если в микроконтроллере здесь быстрая процедура деления на 10 http://forum.easyelectronics.ru/viewtopic....f=4&t=13470

Сообщение отредактировал twix - Apr 4 2018, 14:52
Go to the top of the page
 
+Quote Post
Sprite
сообщение Apr 4 2018, 15:02
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(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, операция деления и вычитания в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.
Go to the top of the page
 
+Quote Post
_pv
сообщение Apr 4 2018, 15:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(twix @ Apr 4 2018, 20:49) *
Автору полагаю лучше использовать деление и вычитание. Самая дорогая операция деление на 100.10723 - 10000 = 723 /100 = 7

это будет работать если только в таблице меньше 15 частот, дальше будут ошибки.
вычисление логарифма не такое и медленное, несколько десятков тактов.
Go to the top of the page
 
+Quote Post
Sprite
сообщение Apr 4 2018, 15:29
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



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

Вы правы) Поторопился я немного с выводом.
Go to the top of the page
 
+Quote Post
twix
сообщение Apr 4 2018, 17:32
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 4-11-15
Пользователь №: 89 174



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

Сообщение отредактировал twix - Apr 4 2018, 18:02
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 5 2018, 09:01
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Sprite @ Apr 4 2018, 18:02) *
в сравнении с проходом по всему массиву ничто! Тему можно считать закрытой.


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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
k155la3
сообщение Apr 5 2018, 17:30
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

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

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Apr 6 2018, 06:47
Сообщение #10


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
_pv
сообщение Apr 6 2018, 07:21
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



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

ну не хранить же весь массив в памяти для этого, а вместо того чтобы на каждом шаге поиска считать 1.01^N, один раз вычислить логарифм будет куда быстрее.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016