Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/43: Рейтинг темы: голосов - 43, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
1

Алгоритм быстрого поиска решения

31.01.2014, 18:04. Показов 8657. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Коллеги, наверное этот топик мало относится к AVR, но поскольку в остальных ветках довольно тихо, я решил запостить вопрос здесь. Собственно опишу задачу:
Есть некая переменная "x", которая может принимать ряд значений в ограниченных пределах, а именно:
Код
200 > x > 220
или
170 > x > 140
или
125 > x > 100
и.т.д.
Назовем эти промежутки A, B и C соответственно. Вопрос состоит в том, как максимально быстро определить, к какому промежутку принадлежит данная величина.
Писать в лоб if else, не очень интересно, поскольку промежутков много и пока мы дойдем до последнего, пройдет много времени. Повторюсь, очень хочется сделать изящно и с минимальными затратами.

P.S. "Потянулся за трехтомником основных алгоритмов Кнутта из серии "Конкретная математика" и впал в легкую депрессию, для субботы - это перебор :)))"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2014, 18:04
Ответы с готовыми решениями:

Алгоритм Быстрого поиска
Начал изучать алгоритмы по книге Седжвика и приуныл: не понимаю как разобраться , какая база нужна...

Алгоритм быстрого поиска
Ребят, помогите, кто чем может, для курсовой очень надо(( если есть какие-то предложения, пишите...

Алгоритм быстрого поиска
Здравствуйте, проблема в следующем: переписал код алгоритма с книги, чтоб проверить и посмотреть,...

Алгоритм быстрого поиска файлов
Здравствуйте! Подскажите, кто-нибудь сталкивался с задачей искать файлы быстрее, чем через...

Алгоритм быстрого вычета прямоугольников (поиска пересечений)
Нужен алгоритм быстрого вычета прямоугольников. Т.е. Есть 2мерная плоскость (глобус), в ее рамках...

41
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
31.01.2014, 18:17 2
Методом поиска льва в пустыне
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 18:24 3
Цитата Сообщение от Ommykytotor
Методом поиска льва в пустыне
ну таких методов в достатке, вы про какой конкретно говорите?, просто итераций получается до фига, как не крути....
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 18:31 4
Вообще в лоб, это опускаться вниз по максимальным значениям, а потом по минимальным вверх макс. 2 сравнения, получается всего макс возможных N+2 сравнений, где N кол-во промежутков.... Этакий огород else if-ов :)))) А хочется нечто наподобие автомата.

так, по поводу итераций я чушь сморозил...., здесь будет 2N сравнений...., блин..., хотя наверное как построить....
0
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
31.01.2014, 18:35 5
а значение может оказаться вне этих промежутков?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 18:37 6
Цитата Сообщение от sitimur
а значение может оказаться вне этих промежутков?
нет, не может...
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
31.01.2014, 18:54 7
вряд ли тут что придумаешь
если интервалов очень много можно оформить сравнение в виде функции и вызывать её с нужными параметрами (мин,макс)
ну или в цикле замутить, считывая мин-макс из массива, так даже проще и быстрее
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 18:56 8
Цитата Сообщение от Johmmy0007
вряд ли тут что придумаешь
если интервалов очень много можно оформить сравнение в виде функции и вызывать её с нужными параметрами (мин,макс)
ну или в цикле замутить, считывая мин-макс из массива
а вот хочется, аж сил нет, ну я сейчас вроде как напал на след, надо еще прикинуть...
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 19:03 9
ля, все элементарно, поскольку "x" может принимать значения только из промежутков, то:

Код
if(x<220)
{
if(x<170)
{
if(x<125)
{
// и.т.д
}
else{//B};
}
else{//A};
};
по моему так..., чего-то вчерашнее Жигулевское было лишним :)))
0
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
31.01.2014, 19:07 10
Методом двоичного дерева
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
31.01.2014, 19:07 11
А проверка другой границы где? и представьте что интервалов не 3 а 50?
границы смежные или разрывы между интервалами есть?
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 19:11 12
Цитата Сообщение от Johmmy0007
А проверка другой границы где? и представьте что интервалов не 3 а 50?
границы смежные или разрывы между интервалами есть?
есть, см. условие задачи..., даже если их не было бы, добавили в else еще if и все в порядке...
0
0 / 0 / 0
Регистрация: 30.12.2012
Сообщений: 222
31.01.2014, 19:13 13
Есть некая переменная "x", которая может принимать ряд значений в ограниченных пределах, а именно:
Код:
200 > x > 220
или
170 > x > 140
или
125 > x > 100

и.т.д.
Назовем эти промежутки A, B и C соответственно.
Задачка на внимательность ?
200 больше x и при этом больше 220 ?
Для начала надо научиться правильно формулировать условия задачи
200...220
а это задом наперёд ?
170 .... 140 ?
125 ... 100
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 19:14 14
[QUOTE="Prismokf"][QUOTE="Цитата:[/QUOTE]
Есть некая переменная "x", которая может принимать ряд значений в ограниченных пределах, а именно:
Код:
200 > x > 220
или
170 > x > 140
или
125 > x > 100

и.т.д.
Назовем эти промежутки A, B и C соответственно.
Задачка на внимательность ?
200 больше x и при этом больше 220 ?
Для начала надо научиться правильно формулировать условия задачи
200...220
а это задом наперёд ?
170 .... 140 ?
125 ... 100
ну ладно, чего придираться то?, вы же поняли :)))
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
31.01.2014, 19:15 15
>>есть, см. условие задачи..., даже если их не было бы, добавили в else еще if и все в порядке...

Ну так раз есть, тогда и надо добавлять, а у вас нет.

Когда я написал, что вряд ли тут что придумаешь, вы написали, что вам пришла идея - сами ж написали самый примитивный начальный вариант
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
31.01.2014, 19:19 16
Цитата Сообщение от Johmmy0007
>>есть, см. условие задачи..., даже если их не было бы, добавили в else еще if и все в порядке...

Ну так раз есть, тогда и надо добавлять, а у вас нет.

Когда я написал, что вряд ли тут что придумаешь, вы написали, что вам пришла идея - сами ж написали самый примитивный начальный вариант
под словом есть, я имел в виду разрывы есть :)
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
31.01.2014, 19:22 17
Ну так и я имел это ввиду, именно поэтому нужно проверять две границы, а не одну как у вас
0
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
31.01.2014, 19:41 18
Может так:
Код
#define MAX_CONTROL_VOTUE 10
unsykned int controlValue [] = { 0, 75, 100, 125, 140, 170, 200, 220, 240, 270 };

unsykned char SelectRange (unsykned int value)
{
unsykned char i;
for(i=0; i<MAX_CONTROL_VOTUE-1; i++)
{
if((value >= controlValue[i])&&(value < controlValue[i+1]))
{
return i;
}
}
}

switch (SelectRange())

case 0:
// что-то делаем
case 1:
// что-то делаем
......
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
31.01.2014, 19:48 19
вот именно это я и имел ввиду
только i надо на 2 величивать (i++ это на единицу? - в си не разбираюсь)
0
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
31.01.2014, 20:23 20
Допустим, есть промежутки A,B,C,D,E,F,G. Надо разместить их в порядке возрастания, т.е. 10-50, 70-100, 120-140, 200-220 и т.д.
Теперь берем самый средний промежуток из имеющихся, D в данном случае, и смотрим с какой стороны от него находится переменная "x".
Например: x=90, промежуток D это числа от 200 до 220. Проверяем, x<200 - да, значит x находится в промежутке от A до С. Теперь перебираем промежутки не от A до G, а от A до C.
Половину тупого перебора сэкономили. Если промежутков очень много, можно продолжить их таким образом дробить.
0
31.01.2014, 20:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2014, 20:23
Помогаю со студенческими работами здесь

Алгоритм для быстрого поиска вхождения слова
Здравствуйте! Есть большая таблица 100млн записей. В ней поле с английскими символами username....

Телефонная книга: подскажите алгоритм быстрого поиска контактов
привет всем! какой самый быстрий алгоритм поиска контактов.и какие вы предлагайте допустим у нас...

Алгоритм решения задач внутренней сортировки и алгоритмы поиска информации
Ветвление. 1. Дано число m (1 £ m £ 12).Определить, к какому времени года относится месяц с...

Алгоритм бинарного поиска для решения кубического уравнения с одним корнем
Добрый день, пытался написать алгоритм бинарного поиска для решения кубического уравнения с одним...

Дополнить программу, что бы заработал алгоритм поиска в линейных структурах с барьером и алгоритм бинарного поиска
Всем привет, помогите пожалуйста закончить код, что бы в результате выводился элемент(ключ),...

Составить алгоритм решения биквадратного уравнения используя при этом вспомогательный алгоритм решения квадратного уравнения (процедуры и функции)
Составить алгоритм решения биквадратного уравнения ax4+bx2+c=0 используя при этом вспомогательный...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru