Если существует , равная базе данных, то лучше позволить базе данных позаботиться о фильтрации , чем выполнять фильтрацию в коде - если база данных фильтрует, ей не нужноотправляйте все песни в свой код, что экономит время, а также не перегружает сеть (представьте, что многие пользователи делают это одновременно).Базы данных также могут создавать индексы для текстовых полей (хотя они обычно не будут создавать те, которые были бы наиболее полезны для этого варианта использования), поэтому они также могут находить текст более эффективно или быстрее, чем ваш код.
Внедрение топ-100 в базу данных снова сэкономит время и сетевой трафик, поэтому мой псевдокод (смутно вдохновленный Java JPA) просто позволит базе данных выполнить всю работу:
PreparedStatement queryByTitle = myDatabase.prepareQuery(
"""SELECT *
FROM Songs
WHERE title LIKE '%:partOfTitle%'
ORDER BY songOrder
LIMIT 100"""
).withStringParameter("partOfTitle");
PreparedStatement queryWithoutTitle = myDatabase.prepareQuery(
"""SELECT *
FROM Songs
ORDER BY songOrder
LIMIT 100""")
List<Song> getSongs(String partOfTitle) {
if (partOfTitle.isEmpty()) {
return myConnection.executePreparedQuery(queryWithoutTitle));
} else {
return myConnection.executePreparedQuery(
queryWithTitle, partOfTitle));
}
}
Есливам нужно делать все в коде из большого списка песен, возвращаемых из базы данных, все, что вы делаете, будет в лучшем случае O (количество возвращенных песен) (так как это стоимость получения большого списка из базы данныхво-первых), поэтому ни один конкретный алгоритм O (n) не будет намного быстрее, чем любой другой.
Если существует , то нет базы данных, и вы всегда храните вещи локально в большом списке, вы можете добиться большего успеха, чем O (n),
- , сохраняя список песен, отсортированных по популярности
- , создавая три всех названий песен в gи эффективно, O (k) время поиска для длин-k частей заголовков.