:: Игры Разума
between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Понадобилась мне функция between,
которая возвращает .t. и для варианта с "переставленными" границами,
т.е. between(2, 3, 1)

Параметры числовые.
Скорость выполнения имеет значение.
Может кто подкинет ещё идей?

Пока есть такие варианты:
function between1(a, b, c)
return between(a, b, c) or between(-a, -b, -c)
function between2(a, b, c)
return between(a, b, c) or between(a, c, b)
function between3(a, b, c)
return (a>b)<>(a>c) or (a<b)<>(a<c)
function between4(a, b, c)
return !((a>b)=(a>c) and (a<b)=(a<c))
function between5(a, b, c)
return between(a, min(b, c), max(b, c))
function between6(a, b, c)
return a>=min(b, c) and a<=max(b, c)


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
так лучше

m.first = 3
m.second = 1
m.current = 2.5
?ABS(m.first - m.second) >= ABS(m.current - m.first)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 3 раз(а). Последнее : PaulWist, 07.07.11 12:54
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
PaulWist
так лучше
m.first = -1
m.second = -3
m.current = 2.5
?ABS(m.first - m.second) >= ABS(m.current - m.first)
Неа.
m.first = 0
m.second = 10
m.current = 1


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Видимо, ты имел в виду это:
function between7(a, b, c)
return abs(b-c)>=a - min(b, c)


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
У меня возвращает .t., а у тебя?

first, second - это границы диапазона

current - число которе ищем в диапазоне


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: between
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Goodwin
Видимо, ты имел в виду это:
function between7(a, b, c)
return abs(b-c)>=a - min(b, c)

Нет.

between(current, first, second)
либо


between(current, second, first)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Я минус потерял.
Вот тут врёт:
m.first = 0
m.second = 10
m.current = -1


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
func is_between (aa,bb,cc)
retu between(aa,cc,bb)


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 1 раз(а). Последнее : Влад Колосов, 11.07.11 11:57
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Так оно на прямом порядке не сработает.

Итак, проверяем:
create Cursor result (AlgNo i, TestNo i, time y)
create Cursor alg(code v(254))
insert into alg values('between(a, b, c) or between(-a, -b, -c)')
insert into alg values('between(a, b, c) or between(a, c, b)')
insert into alg values('(a>b)<>(a>c) or (a<b)<>(a<c)')
insert into alg values('!((a>b)=(a>c) and (a<b)=(a<c))')
insert into alg values('between(a, min(b, c), max(b, c))')
insert into alg values('a>=min(b, c) and a<=max(b, c)')
insert into alg values('abs(b-c)>=a - min(b, c)')
test(1, 1, 2, 3)
test(2, 4, 2, 3)
test(3, 1, 3, 2)
test(4, 4, 3, 2)
test(5, 3, 2, 4)
test(6, 3, 4, 2)
select AlgNo, sum(time) from result group by 1 order by 2
function test
param n, a, b, c
scan
s=seco()
ExecScript(;
'for i=1 to 1000000'+chr(13)+ ;
'=('+code+')'+chr(13)+ ;
'endfor')
insert into result values(recno('alg'), n, seco()-s)
endscan
endfunc

Получаем:
Цитата:
№ алгоритма - общее время
2 - 4.1230
1 - 4.3080
6 - 4.3770
7 - 4.4570
5 - 4.5940
3 - 4.7520
4 - 4.8140


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
То есть как не работает?
Задача: определить, находится ли А между Б и В, так ведь? Находится ли двойка между тройкой и единицей или между единицей и тройкой?

ss= SECONDS()
FOR ii = 1 TO 1000000
is_between(ii,30,24)
ENDFOR
?SECONDS()-ss
func is_between (aa,bb,cc)
retu between(aa,iif(cc<bb,cc,bb),iif(bb<cc,cc,bb))

У меня 2.3 сек.

Вариант between(aa, bb, cc) or between(-aa, -bb, -cc) 2.4 сек


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 1 раз(а). Последнее : Влад Колосов, 11.07.11 15:01
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Влад Колосов
То есть как не работает?

Вот это:
func is_between (aa,bb,cc)
retu between(aa,cc,bb)
не работает для 2, 1, 3

Вот это
between(aa,iif(cc<bb,cc,bb),iif(bb<cc,cc,bb))
работает, но долго (5.65 в моей таблице)

У тебя тест некорректный: при ii>30 (т.е. весь цикл) просчитывается только вариант a>c>b


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Чёт я не понимаю, ведь вариант
between(a, b, c) or between(a, c, b)
самый простой, логичный, и явно не самый медленный - чего ж ещё желать то? Или цель найти наиболее "индусский" код реализующий такое поведение

------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: between
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Сначала просто искалось побыстрее, а потом спортивный интерес проснулся.
Однако, ничего любопытного обнаружить не удалось:
очевидно оказалось оптимальным.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: between
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
У меня 3-й вариант самый быстрый!

3,0.6330
4,0.6810
2,0.9660
5,0.9760
7,0.9840
1,1.0430
6,1.0540
8,1.2810

8 - мой вариант


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 (Гостей: 2)

© 2000-2024 Fox Club 
Яндекс.Метрика