• Как вычислять сложность алгоритмов?

    @NgNl
    Jira dev
    Определить точное время выполнения алгоритма по этой нотации нельзя, дает понятие о масштабе сложности, а не о точном его значении.

    O(1) - затраты времени не зависят от размера задачи
    O(log(n)) - при увеличении размера задачи вдвое, затраты времени меняются на постоянную величину
    O(n) - при увеличении размера задачи в 2 раза, затраты времени возрастут тоже в два раза
    O(n^2) - при увеличении размера задачи в 2 раза, затраты времени возрастут примерно в четыре раза
    O(n*log(n)) - при увеличении задачи в два раза, затраты времени возрастут в два раза, плюс некоторая прибавка, относительный вклад которой уменьшается с ростом n. При малых n может вносить очень большой вклад. O(n*log(n)) начинает расти как квадрат при малых n, но потом рост замедляется почти до линейного
    O(n^p) - полиномиальный алгоритмы, остающиеся мечтой для некоторых задач.
    O(a^n), O(n!), O(n^n) - неполиномиальные алгоритмы, в порядке ускорения увеличения затрат времени
    Ответ написан
    Комментировать
  • Как довести до ума полнотекстовый поиск в Djnago + PostgreSQL?

    @Tryggvi Автор вопроса
    Раз никто не отвечает, то я отвечу сам.
    В PostgreSQL активируем расширение "pg_trgm":
    CREATE EXTENSION pg_trgm;
    Потом во Views импортируем:
    from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity


    И в обработке запроса используем данную логику:

    vector = SearchVector('categorysub__name', 'brand__name', 'category__name', 'name', raw=True, fields=('name'))
    vector_trgm = TrigramSimilarity('categorysub__name', q, raw=True, fields=('name')) + TrigramSimilarity('brand__name', q, raw=True, fields=('name')) + TrigramSimilarity('category__name', q, raw=True, fields=('name')) + TrigramSimilarity('name', q, raw=True, fields=('name'))
    return queryset.annotate(search=vector).order_by('price').filter(search=q) or queryset.annotate(similarity=vector_trgm).filter(similarity__gt=0.2).order_by('price')


    Таким образом мы получаем полнотекстовый поиск, который так же будет корректно работать, если пользователь опечатался.

    Если использовать TrigramSimilarity без SearchVector, то результат поиска будет не всегда правдивым.
    Ответ написан
    Комментировать