Архив автора: admin

Куриные ножки фаршированные.

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

Диета грейпфрут для похудения существует?

Вопрос: Много читала про полезные свойства грейпфрута, но видела информацию про вред грейпфрут для желудка. У меня часто бывает изжога, мне можно есть грейпфрут на ночь? Как едят грейпфрут правильно? И самое главное, поможет ли грейпфрут для похудения? Какая у грейпфрута калорийность? Грейпфрутовая диета существует? Как приготовить салат с грейпфрутом?

Ответ: Надо отдать должное грейпфруту, он уже не первое десятилетие помогает многим людям в их нелегкой борьбе за стройность. Этот низкокалорийный фрукт (38 ккал) богат клетчаткой, витаминами А, В, В2 и С, а так же такими минералами, как кальций, магний, фосфор, железо, цинк, натрий и, в особенности, калий.
В грейпфрутах содержатся питательные вещества, которые помогают справиться с приступами сонливости, вялости и головокружения. Но особую ценность имеет флавоноид нарингин, который и придает грейпфруту специфическую горечь. Это вещество активизирует работу печени и обладает желчегонным действием, активизирует вялый кишечник. Читать

Льняной мешочек для украшений

Такой мешочек для украшений напоминает нам фильмы о былых временах. Ведь еще пару веков назад, такой фасон был у дамских ридикюлей и даже кошельки были сшиты по такому же принципу. Сегодня просто невозможно проследить, сколько разных моделей сумок и кошельков можно встретить на прилавках магазинов. Однако о таком простейшем способе сшить косметичку или кошелек все давно уже позабыли.

Мешочек для украшений

Мешочек для украшений

Читать

Холтер мониторирование и его стоимость

Современный мир полон суеты и стрессов. Многие из нас стараются не предавать этому внимания, а как часто случается, что наше сердце перестает выдерживать нагрузку повседневности. Частые перебои в работе сердца, учащенное сердцебиение, а также любой сердечный  дискомфорт заставляют задуматься нас о наличии каких-либо заболеваний. Прекрасной диагностикой заболеваний сердца служит метод холтеровского суточного мониторирования ЭКГ.      В каких ситуациях требуется холтер мониторирование? Исследование проводится в тех случаях, когда неприятные симптомы у человека возникают, а кардиограмма ничего не показывает. Причин этому масса, к примеру, кардиограмма проводится утром, а болезненные ощущения появляются к вечеру. Конечно, тут холтер незаменим.      Давайте разберемся, при каких симптомах стоит прибегнуть к мониторированию? Одной из частых причин, являются нарушения сердечного ритма, сопровождающиеся головокружениями и обмороками. С определенной периодичностью, стоит проводить исследование людям с угрозой ишемической болезни сердца, аритмии, гипотензии. В обязательном порядке мониторирование проводят людям с врожденными пороками сердца, перенесенными инфарктами, сердечной недостаточностью. Для диагностических целей исследование проводится при эндокринных заболеваниях, а так же у людей, страдающих избыточным весом.     Холтер мониторирование заключается в непрерывной регистрации работы сердца в течении определенного времени. Как правило, длительность исследования варьируется от 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

Алгоритм прост и тривиален, а главное, как было замечено выше, зачастую неплохо работает, особенно, когда строка поиска не сильно велика.
Разобравшись с прямым подходм, давайте  посмотрим, как решать эту задачу — правильно.
Алгоритм Кнута-Морриса-Пратта (КМП)
Алгоритм Бойера — Мура

Используемая литература:

  1. Википедия
  2. habrahabr

Автор: 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
aa0
abab0
abaaba1
abababab2
ababcababc0
ababcaababca1
ababcabababcab2
ababcabaababcaba3

Итак, идея ясна? Ну тогда попробум написать префикс функцию в лоб:

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 при любой другой букве.
И хотя мы делаем меньше сравнений(пропускаем середину слова), однако весь совпадающий префикс мы проходим, что не есть хорошо.

Это уже не плохо, однако, мы с Вами так и не научились использовать  информацию, полученную на предыдущих и