![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
![]()
Добрый день. Есть функция на основе цикла FOR для удаления подстрок из строки за один проход
Код:
1<script>2</script>3 4<script>5</script>6 трансформирует в 1< 4< а должно быть 13 46 Подскажите, кто в курсе, в чем ошибка? З.Ы. Цикл FOR используется для того чтобы в затем ввести CASE при выборе тега для обработки и как самый быстрый вариант(один проход от первого символа до последнего в строке) |
![]() |
![]() |
![]() |
#2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Ваш вариант исправлять не стал, ибо он полностью негодный. Мало того, что понять логигу его работы очень сложно и в нем где-то ошибка, так еще и работает долго.
Код:
Вот, немного оптимизировал. Избавился от Delete и записываю результат посимвольно: Код:
___________________________________ ___________________________________ ________ На Lazarus'e ~ 15% А в целом скорость на Lazarus'e раза в 2 меньше ![]() Последний раз редактировалось Sibedir; 11.02.2013 в 07:39. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
![]()
Спасибо за ответ, НО.....
1. код на базе while и repeat уже есть. работает 2. "Мало того, что понять логигу его работы очень сложно и в нем где-то ошибка, так еще и работает долго. " - поясняю, используется код на базе цикла FOR(удаление подстрок за ОДИН проход строки): - берется символ соответсвующий значению счетчика цикла - если нет условия то символ копируется в буфер - если есть условие = '<', тогда проверяем дальше есть ли условие = '<script'(если да, тогда вычисляем число символов Differ в конструкции <script ghghg>fcgfgfgfgfg</script> - если условия нет(<a> к примеру), тогда символ копируется - если условие есть, тогда запрещаем копирование в буфер, пока Differ не равен нулю, при этом в каждом такте уменьшаем Differ на еденицу. при этом после последнего символа конструкции возобновляется копирование символов в буфер, если конечно нет условия - ну и в конце цикла результат передается на выход функции И что тут не так? эта версия должна быть самой быстрой и максимально логичной. жаль что нельзя менять состояние счетчика цикла, было бы еще проще |
![]() |
![]() |
![]() |
#4 | |||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
![]() никому она ничего не должна ----------------------------------------------------------------------------------------------------------------------------------------------- Цитата:
Цитата:
Код:
----------------------------------------------------------------------------------------------------------------------------------------------- Вообще, если заниматься оптимизацией, то впервую очередь нужно было избавиться от Код:
|
|||
![]() |
![]() |
![]() |
#5 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
полсе того как Цитата:
и в полном соответствии с описанием копируем нужное число символов (1) итого '1<'
программа — запись алгоритма на языке понятном транслятору
|
||
![]() |
![]() |
![]() |
#6 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Кстати, если уж сравнивать производительность циклов, нелишним было бы посмотреть вот на это (ниже приведен код и то, что откомпилировало Delphi):
Вариант 1 - использование repeat..until Код:
PHP код:
Код:
PHP код:
Так что использование конструкции for никоим образом не гарантирует более высокую производительность, а в некоторых случаях (как у вас) неоправданное стремление юзать именно for приводит к её снижению. Последний раз редактировалось Sibedir; 11.02.2013 в 10:21. |
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
![]() Цитата:
что касается использования цикла FOR, там ведь идет посимвольное копирование(если не запрещено), что может быть быстрее? чем пройтись по символам? к тому же далее будет усложнение условий запрета на копирование на самом деле есть несколько десятков разновидностей тегов вида <fgf hghghg>fghfgfgfgfgf</fgf>. далее будет оператор CASE и ветвление логики обработки. и все это в одном такте цикла, без внутренних дополнительных циклов. разве такой вариант не будет быстрее вот кстати полностью рабочая версия функции Код:
|
|
![]() |
![]() |
![]() |
#8 | ||||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
Код:
Цитата:
Туда же (к медленному перераспределению памяти) относятся Сopy/Delete/.... Цитата:
Цитата:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 11.02.2013 в 16:04. |
||||
![]() |
![]() |
![]() |
#9 | |||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
Код:
Код:
------------------------------------------------------------------------------------------------------------------------ Цитата:
------------------------------------------------------------------------------------------------------------------------ Цитата:
Время выполнения 10000000 итераций: вариант из поста #7 - 4,25 сек 2-ой вариант из поста #2 - 1,08 сек |
|||
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
![]()
может Я чего не понял? но замена Buffer:=Buffer+Data[I] на
Код:
нельзя ли поподробнее? |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Найти второй по величине элемент массива (за два прохода; за один проход) (на Паскале) | Мaрина | Помощь студентам | 2 | 26.09.2011 13:49 |
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, | Шпунюся | Помощь студентам | 1 | 16.12.2010 21:02 |
Разбор программы на логические блоки в один проход | Utkin | Общие вопросы Delphi | 23 | 27.07.2009 10:15 |
Сортирование масивов за один проход | NightWishMaster | Паскаль, Turbo Pascal, PascalABC.NET | 10 | 18.10.2007 08:05 |