Автор Тема: Очень простой цикл  (Прочитано 56554 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Очень простой цикл
« Ответ #75 : Июнь 05, 2012, 08:02:14 am »
Чета тут обобщать задачу начали. ??? info21 циклом дейкстры махает... Лично я код писал под конкретную задачу.
Если уж обобщать, то бойер-мур...  :P  ;)
Я не обобщал. Честно-честно!
Та не... Я про то, что начали распространять на произвольную длину шаблона (как тут)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #76 : Июнь 05, 2012, 08:07:28 am »
только без вые..онов  ;) - Это раз, Влад знал задачу ПОЛНОСТЬЮ - в отличии от других, это два...
Дык задача полностью была раскрыта еще на первой странице обсуждения 25го мая: http://oberspace.dyndns.org/index.php/topic,253.msg6094.html#msg6094
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #77 : Июнь 05, 2012, 08:09:36 am »
только без вые..онов  ;) - Это раз, Влад знал задачу ПОЛНОСТЬЮ - в отличии от других, это два...
Дык задача полностью была раскрыта еще на первой странице обсуждения 25го мая: http://oberspace.dyndns.org/index.php/topic,253.msg6094.html#msg6094
Тык это произошло только после того как я поднял "вонь", да и то, не сразу...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Очень простой цикл
« Ответ #78 : Июнь 05, 2012, 08:11:56 am »
Хм.. А я первое сообщение смотрел.  :)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #79 : Июнь 05, 2012, 12:50:49 pm »
В борьбе с рукосуйством и мракобесием Info21 малость обосрался.
Цитата: Info21
"Рукосуи, не понимающие, с чем "едят" ЦД (это про альтернативно удаленных), не въезжают, что конъюнкция отрицаний охран сразу доказывает корректность цикла:
(i >= LEN(a)) OR (oneZero & (a[ i]=0))"
Конъюнкция отрицаний охран, дорогой товарищ, НЕ доказывает корректность цикла. Ни сразу ни потом. Корректность цикла доказывает конъюнкция отрицаний охран & инвариант цикла. Игнорирование последнего весьма характерно для любителей линейного поиска во главе с Info21. Инвариант им на хрен не нужен, я как-то писал об этом на оберонкоре. Само собой, то сообщение было удалено Темиргалеевым.

Кроме того, Info21 не мешало бы прочитать переведенную им же книгу и понять, что в случае массива можно в 2 раза сэкономить на сравнениях, если начинать искать второй нуль. О чем черным по белому было сказано здесь http://oberspace.dyndns.org/index.php/topic,253.msg6115.html#msg6115

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Очень простой цикл
« Ответ #80 : Июнь 05, 2012, 01:20:59 pm »
Наверно торможу но не понял что значит:
Цитировать
можно в 2 раза сэкономить на сравнениях, если начинать искать второй нуль

Разве на двух элементах будет профит?

Или типа как я сэкономил?
http://oberspace.dyndns.org/index.php/topic,253.msg6133.html#msg6133

ps У меня кстати там ошибка есть. Я не учитываю, что длина массива может быть < 2.
Ну т.е. все это нужно в IF засунуть

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #81 : Июнь 05, 2012, 01:48:49 pm »
Разве на двух элементах будет профит?
Да , будет ( и уточненные условия Влада его допускают )- проблема в том, что  Петр не привел решение
и по этому out of contest (хотя ,я не уверен, что сгенерированный машинный код будет оптимален).
« Последнее редактирование: Июнь 05, 2012, 01:50:23 pm от DIzer »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Очень простой цикл
« Ответ #82 : Июнь 05, 2012, 02:03:29 pm »
Понятно что на таком раскладе будет экономия в 2 раза:

[01][01][01][01][10][0]

Слева направо проверяем каждый второй элемент. Если нуль то проверяем первый. И в конце если количество элементов нечетное (дешевая проверка), то проверяем последний элемент.

Но какова вероятность такого расклада?

У бойера-мура эта стратегия хорошо работает на длинных шаблонах имхо

p.s. Хотя следует признать, что в среднем будет больше экономии чем у меня
« Последнее редактирование: Июнь 05, 2012, 02:06:39 pm от ilovb »

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #83 : Июнь 05, 2012, 02:05:17 pm »
единственный момент,  ilovb, здесь существенно используется техника сокращенных вычислений логических выражений, а если вы хотите получить gain прыгая через блок (2 х элементный), пофигу первый 0 вы вставляете в начало условия (ищите) или второй ...

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #84 : Июнь 05, 2012, 03:26:11 pm »
можно в 2 раза сэкономить на сравнениях, если начинать искать второй нуль
Кстати можно исходный двухбайтовый wchar_t* привести к четырёхбайтовому int* и всё свести к обычному линейному поиску четырёхбайтового нуля.  :) :) :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #85 : Июнь 05, 2012, 03:42:42 pm »
;D ;D ;D Да ладно..."некто Vlad"   :D  ;) - среди приведенных здесь вариантов не требующих особых знаний,
но "с претензиями" - это одно из внятных (мне лично, оно нравится больше вашего).

Ты уверен, что при сравнении оставил за скобками мелочи типа сишного синтаксиса и адресной арифметики, которые могут не нравится сами по себе? Кроме того, мое решение учитывает конкретную задачу (не только найти нули, но и по дороге собрать нужные данные). В чистом виде (только поиск нулей) я бы написал что-то очень похожее на последний вариант Сергея. Только вложенный цикл вытащил бы в функцию. Что-то типа:
while ((next = find_zero(next))[1])
    next += 2;

Куда здесь воткнуть цикл Дейкстры, чтоб оно было более наглядно/доказательно - не представляю...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #86 : Июнь 05, 2012, 03:46:40 pm »
можно в 2 раза сэкономить на сравнениях, если начинать искать второй нуль
Кстати можно исходный двухбайтовый wchar_t* привести к четырёхбайтовому int* и всё свести к обычному линейному поиску четырёхбайтового нуля.  :) :) :)

wchar_t бывает 32-битным, причем не на самых экзотических платформах (Мак). Кроме того, даже в случае 16-битного wchar_t - два нуля могут лечь между двумя 32-битными int.

DIzer

  • Гость
Re: Очень простой цикл
« Ответ #87 : Июнь 05, 2012, 04:05:03 pm »
да , пример [10][01] - конец поиска лежит на границе блоков, по этому если без "претензий"
i:=1;
WHILE !( (A[i-1]=0) & (A[i]=0)) DO
INC(i)
END;
 
если мы хотим скорости , то раскрываем  условие по правилам де Моргана - в ЯП с гарантированным использованием укороченной схемы вычисления логических выражений будет и  профит (без мозго..ства).
« Последнее редактирование: Июнь 05, 2012, 04:06:41 pm от DIzer »

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Очень простой цикл
« Ответ #88 : Июнь 05, 2012, 04:13:03 pm »
wchar_t бывает 32-битным, причем не на самых экзотических платформах (Мак). Кроме того, даже в случае 16-битного wchar_t - два нуля могут лечь между двумя 32-битными int.

C#:
char - 2 byte
int - 4 byte
long - 8 byte

char* p = begin;
while (*((int*)p) != 0)
{
  p++;
}

n = (long)(p - begin);

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Очень простой цикл
« Ответ #89 : Июнь 05, 2012, 04:28:17 pm »
C#:
char - 2 byte
int - 4 byte
long - 8 byte

Да, так будет работать на платформах с указанными размерами char и int.  При условии, что доступ к невыровненным данным не вызывает исключения ;)