Блюдо идеально для праздничного стола – с одной стороны ,блюдо из курицы, с другой – не надо пачкать руки, и вкусно! И еще и бюджетно).
Берем курочки ножки, или окорочка, руками закатываем кожу до самого нижнего конца сустава, главное ее не порвать.
Читать
Архив автора: admin
Диета грейпфрут для похудения существует?


Льняной мешочек для украшений
Такой мешочек для украшений напоминает нам фильмы о былых временах. Ведь еще пару веков назад, такой фасон был у дамских ридикюлей и даже кошельки были сшиты по такому же принципу. Сегодня просто невозможно проследить, сколько разных моделей сумок и кошельков можно встретить на прилавках магазинов. Однако о таком простейшем способе сшить косметичку или кошелек все давно уже позабыли.
Холтер мониторирование и его стоимость
Современный мир полон суеты и стрессов. Многие из нас стараются не предавать этому внимания, а как часто случается, что наше сердце перестает выдерживать нагрузку повседневности. Частые перебои в работе сердца, учащенное сердцебиение, а также любой сердечный дискомфорт заставляют задуматься нас о наличии каких-либо заболеваний. Прекрасной диагностикой заболеваний сердца служит метод холтеровского суточного мониторирования ЭКГ. В каких ситуациях требуется холтер мониторирование? Исследование проводится в тех случаях, когда неприятные симптомы у человека возникают, а кардиограмма ничего не показывает. Причин этому масса, к примеру, кардиограмма проводится утром, а болезненные ощущения появляются к вечеру. Конечно, тут холтер незаменим. Давайте разберемся, при каких симптомах стоит прибегнуть к мониторированию? Одной из частых причин, являются нарушения сердечного ритма, сопровождающиеся головокружениями и обмороками. С определенной периодичностью, стоит проводить исследование людям с угрозой ишемической болезни сердца, аритмии, гипотензии. В обязательном порядке мониторирование проводят людям с врожденными пороками сердца, перенесенными инфарктами, сердечной недостаточностью. Для диагностических целей исследование проводится при эндокринных заболеваниях, а так же у людей, страдающих избыточным весом. Холтер мониторирование заключается в непрерывной регистрации работы сердца в течении определенного времени. Как правило, длительность исследования варьируется от 24 до 72 часов. Запись ведется при помощи холтера — носимого регистратора, принимающего кардио-сигнал высокого качества. Также, во время исследования больной ведет дневник, в котором отмечает время, беспокоящие симптомы, принимаемые лекарственные средства, физические нагрузки. Холтер фиксирует состояние сердца как в дневное, так и ночное время. Во время работы аппарат регистрирует электрокардиограмму, актиграфию (фиксация физических нагрузок), а так же контролирует артериальное давление. Стоимость холтеровского мониторирования зависит от модели аппарата, а также клиники, предоставляющей его для исследования. Как правило, цены варьируются от 800 до 3000 рублей. Подводя итог, хочется сказать, что холтер — это безопасный и высокоэффективный метод диагностики сердечных нарушений, который позволяет более точно определить заболевание и подобрать необходимое лечение.
Поиск первого вхождение подстроки. Решение в лоб.
Поиск информации — одно из основных использований компьютера. Одна из простейших задач поиска информации — поиск точно заданной подстроки в строке. Тем не менее, эта задача чрезвычайно важна — она применяется в текстовых редакторах, СУБД, поисковых машинах…
С поиском подстроки мы встречаемся постоянно. Всем любимый ctrl+f, это именно то, что нам нужно.
Часто ли вы задумывались, а как оно работает? Многие из Вас, наверняка, скажут, что если потребуется — сделаем.
Большинство, думаю, решат эту задачу в лоб и для наглядности я покажу, как это сделать.
Прямой поиск, или, как еще часто говорят, «просто взять и поискать» — это первое решение, которое приходит в голову неискушенному программисту. Суть проста: идти по проверяемой строке A и искать в ней вхождение первого символа искомой строки X. Когда находим, делаем гипотезу, что это и есть то самое искомое вхождение. Затем остается проверять по очереди все последующие символы шаблона на совпадение с соответствующими символами строки A. Если они все совпали — значит вот оно, прямо перед нами. Но вот если какой-то из символов не совпал, то ничего не остается, как признать нашу гипотезу неверной, что возвращает нас к символу, следующему за вхождением первого символа из X.
Многие люди ошибаются в этом пункте, считая, что не надо возвращаться назад, а можно продолжать обработку строки A с текущей позиции. Почему это не так, легко продемонстрировать на примере поиска X=«AAAB» в A=«AAAAB». Первая гипотеза нас приведет к четвертому символу A: «AAAAB», где мы обнаружим несоответствие. Если не откатиться назад, то вхождение мы так и не обнаружим, хотя оно есть.
Неправильные гипотезы неизбежны, а из-за таких откатываний назад, при плохом стечении обстоятельств, может оказаться, что мы каждый символ в A проверили около |X| раз. То есть вычислительная сложность сложность алгоритма O(|X||A|). Так поиск фразы в параграфе может и затянуться…
Справедливости ради следует отметить, что если строки невелики, то такой алгоритм может работать быстрее «правильных» алгоритмов за счет более предсказуемого с точки зрения процессора поведения.
А вот и реализация:
def stringSearch(s, x):
i=j=0
lengthS = len(s)# Длина строки в которой ищем
lengthX = len(x)# -||- которую ищем
# пока не достигли одного из концов
while i<=lengthS - lengthX and j>lengthx:
# если совпали буквы продвигаемся по обеим строкам
if li[i+j]==x[j]:
j+=1
# иначе двигаемся по строке(+1), начиная с 0 символа подстроки
else:
i+=1
j=0
# если дошли до конца подстроки - нашли, иначе - нет
return i if j==lengthX else None
Алгоритм прост и тривиален, а главное, как было замечено выше, зачастую неплохо работает, особенно, когда строка поиска не сильно велика.
Разобравшись с прямым подходм, давайте посмотрим, как решать эту задачу — правильно.
Алгоритм Кнута-Морриса-Пратта (КМП)
Алгоритм Бойера — Мура
Используемая литература:
Автор: Pavel Petropavlov
Алгоритм Кнута-Морриса-Пратта (КМП)
Алгоритм был разработан Кнутом (Knuth) и Праттом (Pratt) и независимо от них Моррисом (Morris) в 1977 г.
Он относится к «правильным» подходам решения поставленной задачи, в отличии от тривиального подхода, рассмотренного ранее.
Данный подход хоть и считается достаточно тривиальным, описания, которые нашел я, зачастую пестрят математическими основами и доказательствами, которые сбивают с сути. Так в книге, уважаемого Никлауса Вирта, приводится описание, которое я так и не одолел.
Однако я нашел пару статей, которые достаточно информативны, они приведены в ссылках и рекомендуемы для ознакомления.
Для понимания: Префикс строки A[..i] — это строка из i первых символов строки A. Суффикс строки A[j..] — это строка из |A|-j+1 последних символов. Подстроку из Aбудем обозначать как A[i..j], а A[i] — i-ый символ строки.
В статье http://habrahabr.ru/post/111449/ сказано:
Идея КМП-поиска – при каждом несовпадении двух символов текста и образа образ сдвигается на все пройденное расстояние, так как меньшие сдвиги не могут привести к полному совпадению.
Многие люди ошибаются в этом пункте, считая, что не надо возвращаться назад, а можно продолжать обработку строки A с текущей позиции. Почему это не так легко продемонстрировать на примере поиска X=«AAAB» в A=«AAAAB». Первая гипотеза нас приведет к четвертому символу A: «AAAAB», где мы обнаружим несоответствие. Если не откатиться назад, то вхождение мы так и не обнаружим, хотя оно есть.
Для реализации данного алгоритма, нам необходимо рассмотреть, так называемую, префикс функцию.
Префикс-функция — это массив чисел, вычисляющийся, как наибольшая длина суффикса, совпадающего с её префиксом. Как пример, берем каждый возможный префикс строки и смотрим самое длинное совпадение начала с концом префикса (не учитывая тривиальное совпадение самого с собой).
Вот пример для «ababcaba»:
| суффикс | префикс | p |
|---|---|---|
| a | a | 0 |
| ab | ab | 0 |
| aba | aba | 1 |
| abab | abab | 2 |
| ababc | ababc | 0 |
| ababca | ababca | 1 |
| ababcab | ababcab | 2 |
| ababcaba | ababcaba | 3 |
Итак, идея ясна? Ну тогда попробум написать префикс функцию в лоб:
def predkompil(x):
#первый символ всегда 0, поэтому заносим и пропускаем
d = {0:0}
for i in xrange(1,len(x)):
# проходоим от конца к началу
j = i
sdvig = 0
while j>0:
j -= 1
if x[j] == x[i-sdvig]:
sdvig += 1
else:
j += sdvig
sdvig = 0
d[i] = sdvig
return d
Вроде работает, но как то много сравнений и проходов. Попробуем оптимизировать.
Начать можно с замены строки j = i, на j = d[i-1]+1.
Что нам это дает? А то, что незачем просматривать каждый раз с конца и до начала. Можно заметить, что если мы на предыдущем шаге (i-1) нашли вхождение > 0 (d[i-1]), то и начинать стоит с данной позиции (d[i-1]).
Пример:
При i=4 ABAAB -> 2, тогда на i+1, т.е. i=5 смотрим не с j=i(5), а с 3! Т.к. либо счетчик вырастет и станет 3 в случае ABAABA, либо сбросится в 0 при любой другой букве.
И хотя мы делаем меньше сравнений(пропускаем середину слова), однако весь совпадающий префикс мы проходим, что не есть хорошо.
Это уже не плохо, однако, мы с Вами так и не научились использовать информацию, полученную на предыдущих и



