Upgrade to Pro — share decks privately, control downloads, hide ads and more …

№ 9. Фильтр Блума и проекты

B1196c22fd3ca181eec43e1b67823d3f?s=47 ОПК
April 19, 2021

№ 9. Фильтр Блума и проекты

1. Фильтр Блума.
2. Генерация хеш-функций для фильтра Блума.
3. Что такое хорошая программа (хороший проект)?
4. Хорошие и плохие интерфейсы (модулей и программ).
5. Тестирование и документирование.

B1196c22fd3ca181eec43e1b67823d3f?s=128

ОПК

April 19, 2021
Tweet

Transcript

  1. ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ Лекция № 9 19 апреля 2021 г.

    Дешево Быстро Качественно
  2. ФИЛЬТР БЛУМА • Вероятностная структура данных с двумя операциями :

    • Добавить элемент . • Проверить присутствие элемента, причем возможен ложноположительный результат . • Используется для быстрого отфильтровывания запросов к более медленному хранилищу.
  3. ФИЛЬТР БЛУМА: 
 РЕАЛИЗАЦИЯ • Структура данных состоит из :

    • битовый массив bs длины m , • k независимых хеш-функций h1, h2, …, hk (область значений [0…m)) . • Реализация операций : • Добавить элемент e: 
 bs[h1(e)] = bs[h2(e)] = … = bs[hk(e)] = 1 • Проверка принадлежности: 
 result = bs[h1(e)] && bs[h2(e)] && … && bs[hk(e)]
  4. ФИЛЬТР БЛУМА : ПРИМЕР • Добавить x (h1(x) = 5,

    h2(x) = 1, h3(x) = 13). • Добавить y (h1(y) = 4, h2(y) = 16, h3(y) = 11). • Добавить z (h1(z) = 11, h2(z) = 3, h3(z) = 5) . • Содержит ли x (h1(x) = 5, h2(x) = 1, h3(x) = 13) ? • Содержит ли u (h1(u) = 6, h2(u) = 11, h3(u) = 1)? • Содержит ли v (h1(v) = 11, h2(v) = 4, h3(v) = 16)? 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 m = 18, k = 3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 • Возможно . • Нет. • Возможно.
  5. ФИЛЬТР БЛУМА : АНАЛИЗ • Вероятность ложного результата ≈ (1

    − e−kn/m)k . • Оптимиальное число хеш-функций, минимизурющее количество ложных результатов: k = m ln 2 / n . • В этом случае размер битового массива в зависимости от количества элементов (n) и желаемой вероятности ложных результатов (p): m = − n ln p / (ln 2)2 . • Например, для p = 0,01, m ≈ 9,6n – 10 бит на элемент.
  6. ФИЛЬТР БЛУМА : НАБОР ХЕШ-ФУНКЦИЙ • Как получить k независимых

    хеш-функций ? • Взять хеш-функцию большого размера M (512 бит и более) и разбить значение на кусочки размера M/k . • Взять две различные и составить из них линейные комбинации . • Взять хеш-функцию, параметризующуюся начальным «зерном» (seed) (например, MurmurHash), и использовать k различных зерен.
  7. ХОРОШИЙ ПРОЕКТ • Функциональность (решение заявленной задачи) . • Отсутствие

    ошибок, устойчивость . • Понятный интерфейс, наличие документации . • Качество кода : • Функции и модули . • Отсутствие copy-paste . • Отступы и т. д . • Наличие тестов . • Клёвый!
  8. УСТОЙЧИВОСТЬ • Аксиома. Входным данным нельзя доверять . • Следствие.

    Данные нужно проверять и либо заменять некорректные значения корректными, либо сигнализировать об ошибке . • Чем проще программа, тем она, как правило, устойчивее.
  9. ИНТЕРФЕЙС МОДУЛЯ (БИБЛИОТЕКИ) • Вопросы, на которые ответ должен быть

    ясен : • Кто создает и освобождает ресурсы ? • Как возвращаются ошибки ? • Самый простой способ ответить на вопросы: поместить в документацию небольшой пример.
  10. ИНТЕРФЕЙС КОМАНДНОЙ СТРОКИ • Программа, запущенная без аргументов (или с

    ключами 
 -h, --help, /?), выдает справку: «я такая-то программа, меня запускать так-то» . • Использование кода возврата sys.exit() для сигнализирования об ошибках и результатах . • Текстовые сообщения об ошибках на разные случаи.
  11. ПРИМЕР СПРАВКИ (ZIP) $ zi p Copyright (c) 1990-2008 Info-ZIP

    - Type 'zip "-L"' for software license . Zip 3.0 (July 5th 2008). Usage : zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list ] The default action is to add or replace zipfile entries from list, whic h can include the special name - to compress standard input . If zipfile and list are omitted, zip compresses stdin to stdout . -f freshen: only changed files -u update: only changed or new file s -d delete entries in zipfile -m move into zipfile (delete OS files ) -r recurse into directories -j junk (don't record) directory name s -0 store only -l convert LF to CR LF (-ll CR LF to LF ) -1 compress faster -9 compress bette r -q quiet operation -v verbose operation/print version inf o -c add one-line comments -z add zipfile commen t -@ read names from stdin -o make zipfile as old as latest entr y -x exclude the following names -i include only the following name s -F fix zipfile (-FF try harder) -D do not add directory entrie s -A adjust self-extracting exe -J junk zipfile prefix (unzipsfx ) -T test zipfile integrity -X eXclude eXtra file attribute s -y store symbolic links as the link instead of the referenced fil e -e encrypt -n don't compress these suffixe s -h2 show more hel p
  12. ПРИМЕР ВЫВОДА ZIP И UNZIP $ zip src *.c *.

    h adding: assoc_list.c (deflated 68% ) adding: phonebook.c (deflated 62% ) adding: reader.c (deflated 67% ) adding: assoc_list.h (deflated 57% ) adding: reader.h (deflated 39% ) $ unzip -t src.zip Archive: src.zi p testing: assoc_list.c O K testing: phonebook.c O K testing: reader.c O K testing: assoc_list.h O K testing: reader.h O K No errors detected in compressed data of src.zip . $ unzip -t notfound.zip unzip: cannot find or open notfound.zip, notfound.zip.zip or notfound.zip.ZIP.
  13. ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС • Должно быть понятно, как выйти из программы

    ! • Подтверждение деструктивных операций . • Диалоговый режим: приглашения ко вводу . • Консольный интерфейс: меню, справка по горячим клавишам . • Самостоятельная документация.
  14. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС https://github.com/cypok/tkinter_example

  15. ДОКУМЕНТИРОВАНИЕ • Аксиома. Ваша программа – на Земле не первая

    . • Следствие. Пользователь, скорее всего, уже имеет опыт взаимодействия с другими программами . • Следствие. Если ваша программа ведет себя так же, как уже известная, пользователь сразу сможет с ней работать, ничего не читая . • Главные вопросы, на которые отвечает документация : • «Что это? На что это похоже из того, что я уже знаю? » • «Какие здесь особенности?»
  16. ОСНОВНЫЕ ВИДЫ ДОКУМЕНТАЦИИ • Файл README (что это, зачем нужно

    и на что похоже) . • Инструкция для пользователя (детальное описание функций и режимов работы) . • Инструкция для разработчиков (внутреннее устройство, модули, соглашения, используемые алгоритмы и т.п.)
  17. АВТОМАТИЗИРОВАННОЕ ТЕСТИРОВАНИЕ • Аксиома. Все не протестируешь . • Следствие.

    Тестировать нужно там, где появление ошибок наиболее вероятно и где ошибки будут наиболее критичны . • «Бизнес-логика» vs. «Интерфейс».
  18. КОНЕЦ ДЕВЯТОЙ ЛЕКЦИИ