:: Visual Foxpro, Foxpro for DOS
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
akvvohinc
lulgu
На скорость проверять чьи-то миллионные записи у меня нет времени

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

А так - свою задачу ТС решил и сам.
Он просил помочь как раз с точки зрения скорости работы алгоритма.

Вы тоже сами можете проверить на функции любые свои числа, не буду против лишних проверок.
И что гадать - ТС вы тоже можете помочь, проверив скорость работы.
Если не понравится, ничего страшного не случится.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Но может быть, среднее количество чисел в строке огромно - тогда алгоритм может и устроить
Если в строке очень много чисел, то строка будет очень большой, а поиск чего либо в очень большой строке (при том ещё и обработанной - дополненной разделителями в начале и конце) в цикле - всегда плохое решение. Даже если будет сделано всего 100 таких "поисков" (т.е. данные действительно ограничены 2-значными целыми неотрицательными числами, и безо всяких пробелов/ведущих нулей и т.п. мусора).

Т.е. что для "коротких" строк в 3-10 чисел, что для "очень длинных" в десятки и сотни тысяч чисел, что для неизвестных ограничений на мин/макс число, что для известных но больших (уже 4-знаки это 10к прогонов цикла), что для "не совсем аккуратно указанных" чисел (лишние пробелы, ведущие нули), что для десятичных дробей - указанное решение не подходит. Диапазон его применимости на самом деле смехотворно мал - и даже в этом диапазоне другие решения по скорости запросто его обойдут.
Ну и как это можно в таком случае назвать?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
akvvohinc
Но может быть, среднее количество чисел в строке огромно - тогда алгоритм может и устроить
Если в строке очень много чисел, то строка будет очень большой, а поиск чего либо в очень большой строке (при том ещё и обработанной - дополненной разделителями в начале и конце) в цикле - всегда плохое решение. Даже если будет сделано всего 100 таких "поисков" (т.е. данные действительно ограничены 2-значными целыми неотрицательными числами, и безо всяких пробелов/ведущих нулей и т.п. мусора).

Т.е. что для "коротких" строк в 3-10 чисел, что для "очень длинных" в десятки и сотни тысяч чисел, что для неизвестных ограничений на мин/макс число, что для известных но больших (уже 4-знаки это 10к прогонов цикла), что для "не совсем аккуратно указанных" чисел (лишние пробелы, ведущие нули), что для десятичных дробей - указанное решение не подходит. Диапазон его применимости на самом деле смехотворно мал - и даже в этом диапазоне другие решения по скорости запросто его обойдут.
Ну и как это можно в таком случае назвать?

Прям не строки с цифрами, а описание лошадиных гонок на ипподроме.
Понятно, у ТС какая-то своя реальная проблема (и которую он давно решил), но откуда конкретно вы возьмете свои экзотические строки с цифрами, чтоб так за их опоздания нервничать?



Исправлено 2 раз(а). Последнее : lulgu, 11.10.18 00:32
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
dfr
Автор

Сообщений: 254
Откуда: Барнаул
Дата регистрации: 29.07.2005
Спасибо кто откликнулся.

Потестил скорость. Скрипт от lulgu всех обогнал - 0.55 сек, на моем - 41.35, скрипт от LUCIAN (без пузырьков) - 95.91, Дмитрий Петров - 11.43.
Технологию от Аспид не осилил..

Это на 81 тыще записей, в DBF, с сохранением обратно. Максимально - 20 цифр в строке.
Числа максимум могут 3х-значные, количество в строке примерно как сейчас. Пробелов, ведущих нулей - не имеется.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
dfr
Это на 81 тыще записей, в DBF, с сохранением обратно. Максимально - 20 цифр в строке.
Числа максимум могут 3х-значные, количество в строке примерно как сейчас. Пробелов, ведущих нулей - не имеется.

Думаю, вы где-то сильно ошиблись, или у вас супер-пупер комп (что сомнительно, так как ваш вариант у меня отработал за 30 секунд на 100 тыс.записей).

Даже первый вариант в лоб, где используется цикл от 1 до 100, все 100'000 записей тестового курсора одинаковые и такие, как в вашем примере, на моем компе занимает 8-9 секунд.

При 3-значных числах и, соответственно, цикле от 1 до 999 это время равно 25-26 секунд.

MIN() и MAX() я, конечно не использовал, хотя это уменьшило бы время теста, но и ограничило применение процедуры.
Ведь если это разовая процедура, то зачем ее ускорять? А если планируется выполнять регулярно, то лишь вам известно, может ли количество чисел в строке превысить ограничения в 26 этих функций.
--------------

Здесь не было примеров, построенных исключительно на работе с массивом. Мне очевидно, что она в среднем будет работать быстрее (думаю, раза в полтора на ваших данных и в разы на произвольных данных) и не будет иметь таких ограничений, как 26 чисел для MIN/MAX.
Поэтому если вам требуется еще ускорить функцию lulgu, сообщите.
(хотя даже простая замена TRANSFORM() на ALLTRIM(STR()) немного ускорит процесс)



Исправлено 1 раз(а). Последнее : akvvohinc, 11.10.18 21:24
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Окончательный, супербыстрый, и одновременно универсальный код когда кто напишет - разбудите )
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Окончательный, супербыстрый, и одновременно универсальный код когда кто напишет - разбудите )

Когда мне говорят о "множестве записей", то я обычно подразумеваю "миллионы".

Если же, как оказалось, их не более 100000, то любая, не очень сложная, манипуляция должна "уложиться" в секунды, и если не сотворить что-то "особо умное", то разницей во времени обычно можно пренебречь при любых разумных алгоритмах. Бывают и исключения.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Дада, бывают исключения (нерасчетные величины к формуле), бывает очень много расчетных величин. Все бывает. математики к этому щепитильно относятся к "исключениям", они хотят, чтобы и исключения вошли в их определения. Молодцы. А мы ведь просто скобари, программисты. Может возникнуть вопрос о дробных числах, о комплексных (и возможно специальных условиях упорядочения), о тензорных величинах (мера в "пространстве мер-величин-тензоров")
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
dfr
Taran
Через массив делай.
Alines... Asort.
И между этими командами пробежаться по массиву и строки преобразовать в int.

А уникальные как там искать? (дубли убирать)

Может так:

LPARAMETERS tcIn
LOCAL lnLen,lcOut,lcStr,i
lnLen = ALINES(laStr,tcIn,1,',')
DIMENSION laStr[lnLen,1]
=ASORT(laStr)
lcOut = ','
FOR i = 1 TO lnLen
lcStr = laStr[i]
IF !','+lcStr+','$lcOut
lcOut = lcOut + lcStr + ','
ENDIF
ENDFOR
RETURN SUBSTR(lcOut,2,LEN(lcOut)-2)
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
лулгу, можно и так. Но твой код такой унылый, как и ты... Извини )

Доб. Выпив. Подумал. Я себе приврал. те кто еще свой унылый код показывают с точностью до FOR-a, то это придурки в второй степени отсталости, в квадрате в современных величинах изменения тупости кандидатов на работу... кстати



Исправлено 1 раз(а). Последнее : of63, 11.10.18 22:39
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Основное время занимает перегонка в курсор и обратно - проще отсортировать массив ALINES и обратно из него собрать строку, исключая дубли. Вариант лулгу при использовании 3-знаков проигрывает даже работе через курсор. При этом вариант с курсором как минимум нужно проверять при SET TALK OFF - иначе тонна бесполезных сообщений в статусбар снижает скорость более чем в 4 раза.



------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вобще-то, Игорь, ты привел много строк кода, сомнительного свойства (ну, ты удтверждаешь, что там все вечно, в ваших ЛИЧНЫХ кодах/понятиях збс), но вопрос был в научить юзера извлекать из баз, и просто разговаривать, мтк. ) Не терять контакт с новыми юзерамиию. Я еще попью раз 100, потом вы и сами поймете, как обращаться с новичками )
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
lcIn = '21,22,22,723,23,40,27,40,5'

У ИК такие криминальные способности зазря пропадают.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
вы все числа гоняете по шкурке ? )
""csv - не тот же куй?
Что вы хотите-то? не понимаю
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
dfr
Числа максимум могут 3х-значные


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
и? такой многозначительный.. \
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
Может так:

Да, почти это я и имел в виду.
Требуются только некоторые доработки по сортировке (ее надо делать над числами).

PS
Только хотел показать пример, но увидел, что он является полной копией 3-го варианта Игоря, вплоть до способа отсечения дублей - бывает же такое!
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
У ИК такие криминальные способности зазря пропадают.

Я сравнивал первый вариант от lulgu со своим (и, соответственно, 3-м вариантом Игоря) на произвольных данных, полученных таким образом:
CREATE CURSOR curs1 (s C(100))
= RAND(-1)
m.k_max = 10
FOR m.i=1 TO 100000
s = ''
FOR m.j=1 TO m.k_max
num = MAX(MIN(999,INT(RAND()*1000)),1)
m.s = m.s+TRAN(num)+IIF(j=m.k_max,'',',')
ENDFOR
INSERT INTO curs1 VALUES(m.s)
ENDFOR

то есть 100'000 записей, каждая из которых содержит 10 произвольных чисел в интервале от 1 до 999.

Результат был 100 секунд против 2-3 секунд.



Исправлено 3 раз(а). Последнее : akvvohinc, 12.10.18 00:30
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Лулгу, заметь, тебя упомянули.
Кстати скажу чесно, .. не скажу. Лулгу нас не бросает ) Прикольный
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
[quote of63]Лулгу, заметь, тебя упомянули.
Кстати скажу чесно, .. не скажу. Лулгу нас не бросает ) Прикольный[/quote

Опять глубинами FOR-ами меряются... тоска..
Ratings: 0 negative/0 positive


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

On-line: 27 Владимир Максимов  (Гостей: 26)

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