0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
1 | |
Алгоритм быстрого поиска решения31.01.2014, 18:04. Показов 8657. Ответов 41
Метки нет (Все метки)
Коллеги, наверное этот топик мало относится к AVR, но поскольку в остальных ветках довольно тихо, я решил запостить вопрос здесь. Собственно опишу задачу:
Есть некая переменная "x", которая может принимать ряд значений в ограниченных пределах, а именно: Код
200 > x > 220 или 170 > x > 140 или 125 > x > 100 Назовем эти промежутки A, B и C соответственно. Вопрос состоит в том, как максимально быстро определить, к какому промежутку принадлежит данная величина. Писать в лоб if else, не очень интересно, поскольку промежутков много и пока мы дойдем до последнего, пройдет много времени. Повторюсь, очень хочется сделать изящно и с минимальными затратами. P.S. "Потянулся за трехтомником основных алгоритмов Кнутта из серии "Конкретная математика" и впал в легкую депрессию, для субботы - это перебор :)))"
0
|
31.01.2014, 18:04 | |
Ответы с готовыми решениями:
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
0
|
0 / 0 / 0
Регистрация: 30.12.2012
Сообщений: 222
|
|
31.01.2014, 19:13 | 13 |
или 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]
или 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
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 | |
31.01.2014, 20:23 | |
Помогаю со студенческими работами здесь
20
Алгоритм для быстрого поиска вхождения слова Телефонная книга: подскажите алгоритм быстрого поиска контактов Алгоритм решения задач внутренней сортировки и алгоритмы поиска информации Алгоритм бинарного поиска для решения кубического уравнения с одним корнем Дополнить программу, что бы заработал алгоритм поиска в линейных структурах с барьером и алгоритм бинарного поиска Составить алгоритм решения биквадратного уравнения используя при этом вспомогательный алгоритм решения квадратного уравнения (процедуры и функции) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |