• Как вернуть первые N максимальных элементов из массива без сортировки массива?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть такой алгоритм. Называется quickSelect. Фактически, это обрезанный quickSort, где после выбора ведущего элемента и разбивки массива работа продолжается только в той половине, где находится раздел между первыми K элементами и остальными N-K.

    Пусть у вас N элементов в массиве и надо вернуть K минимальных. Тогда сортировка будет работать за O(N log N), а quickselect за O(N) в среднем*. В худшем случае может быть и квадратичное время работы, но этот случай практически невозможен, если реализация испольует случайные числа для выбора ведущего элемента.

    Если же вы боитесь этого худшего случая, или считаете себя самим невезучим человеком за всю историю человечества (или боитесь, что злой хакер взломает генератор случайных чисел и передаст вашей программе специально составленный массив, чтобы ее подвесить), то есть другой алгоритм, всегда работающий за O(n log k). При маленьких k - может быть даже быстрее первого алгоритма.

    Суть его в том, чтобы в куче (heap aka priority queue) поддерживать пока найденные K минимальных элементов. При этом куча будет на максимум. Сначала туда кладутся первые k элементов массива, а потом каждый следующий вытесняет максимальный элемент в куче, если он его меньше.

    * Вообще говоря, можно заставить quickselect и quicksort работать идеально всегда, если использовать алгоритм Блюма-Флойда-Пратта-Ривеста-Тарьяна, который ищет медиану за O(n). Но на практике этот алгоритм не применятеся, потому что у него такая константа, что там на логарифм хватит и еще на квадрат останется.
    Ответ написан
    2 комментария
  • Можете накидать большую порцию задачек для практики Python-новичка?

    Я когда также искал наткнулся на один сайт там человек выложил тестовое задание которое он получил на вакансию Junior Python Developer.

    Сам сайт я не сохранял сохранил только задание. Выполняя это задание ты охватишь то что учил и освоишь новые технологии.

    Собственно вот само задание:

    Цель тестового задания
    Определить возможную динамику самообучения кандидата. А так же глубину понимания кода, реализующего тестовое задание.

    Задание
    Написать тестовое web-приложение по управлению электронной библиотекой:

    1. Редактирование (доступно авторизованному пользователю при наличии аутентификации):

    Управление списком книг: добавить / удалить / редактировать книгу.
    Управление списком авторов: добавить / удалить / редактировать автора.
    Запись о книге содержит следующие данные: ID, Название.
    Запись об авторе содержит следующие данные: ID, Имя.
    Свзязь между книгами и авторами — многие ко многим.
    2. Поиск книг по названию либо автору (доступно анонимному пользователю при наличии аутентификации).

    3. Аутентификации и авторизация (по желанию кандидата).

    Технологии, которые должны быть задействованы:

    Flask
    SQLAlchemy (Declarative)
    SQLite (встроенный в приложение)
    Jinja2 Templates
    WTForms
    jQuery (желательно, но возможно использование альтернативных решений)
    Список может быть расширен по усмотрению кандидата, но с обязательным использованием технологий, перечисленных выше.

    Дополнительные требования
    Список дополнительных требований следующий:

    1. Код проекта должен быть доступен на сервисе github.org или bitbucket.org.

    2. Проект должен содержать SQL-скрипты для развертывания базы данных и наполнения ее тестовыми данными.

    3. Пользовательские данные должны валидироваться перед сохранением в БД.

    Дополнительные знания
    Дополнительные знания, необходимые при защите проекта:

    HTTP
    WSGI
    SQL, Transactions, Transaction Isolation Levels
    SQLAlchemy
    Уязвимости веб-сайтов
    User Experience
    Ответ написан
    Комментировать