Эффективно ли использовать вложенные хеш-таблицы для этой практической проблемы? - PullRequest
0 голосов
/ 14 декабря 2018

Мне было поручено найти наиболее эффективное решение следующей проблемы: мне нужно распечатать (k) наиболее потоковых фильмов жанра, (g), в данном году, (y), я могу предположить,требуется o (1), чтобы получить текущий год.Примером этого является: каждый раз, когда фильм транслируется, мне дают название фильма и жанр.«Какие топовые 5 самые популярные романтические фильмы в год 2014 ?

Возвращенный ответ может быть примерно таким:

  • MovieName1 (романтика) 3409 потоков
  • MovieName2 (романтика) 4000 потоков
  • MovieName3 (романтика) 5340 потоков
  • MovieName4 (романтика) 9000 потоков
  • MovieName5 (романс) 10000 потоков

Поэтому мой мыслительный процесс заключается в использовании 3-х вложенных хеш-таблиц.

  • Один, где я использую их имя (ключ), чтобы сопоставить счастота (значение)
  • Тот, где я использую жанр (ключ) для сопоставления с картой (имя, частота) (значение)
  • И последний, где я использую год (ключ)) для сопоставления с картой (жанр, карта (имя, частота) (значение)

Имеет ли это какой-то смысл ... Я думаю, что запутался, просто написав это ... Можно ли простоиспользуйте одну хеш-таблицу, которая использует год в качестве ключа и отображает в связанный список узлов, где каждый узел содержит название фильма, frequну и жанр?Будет ли это более эффективным?

Так что, если я хочу обновить частоту Бэтмена, я могу просто сделать map.get (2008), который даст заголовок связанного списка, а затем сделать while(tmp != null){ if(tmp.name == "the dark knight"){ temp.frequency++; }

1 Ответ

0 голосов
/ 14 декабря 2018

Итак, вы подумали об использовании хэш-карты лет для хеш-карт жанров для хеш-карт имен частот.Имеет ли это смысл?Конечно.Это хороший способ решить вашу проблему?Скорее всего нет.Также, как вы говорите, можно также использовать одну основную хэш-карту лет для коллекций кортежей с частотами жанровых имен (или структур во многих языках, таких как C, C ++, Java и т. Д.).Что касается коллекций, вы думали о связанных списках, но вы вполне могли бы использовать векторы или что-то еще (связанные списки очень часто являются худшим видом структур данных).Но это не будет более эффективным и не обязательно будет лучшим способом решения вашей проблемы, даже если он может быть более читабельным и обслуживаемым.

Я не буду говорить об улучшениях производительности, которые не влияют на времясложность, так как вы ясно дали понять в комментариях, что это для экзамена, который заботится только о сложности времени (что печально, но не важно).Кроме того, я предполагаю, что это единственная проблема, которую вам нужно решить.

Давайте посмотрим, как улучшить ваши идеи.Так уж сложилось, что сочетание обоих ваших решений вместе с одним улучшением дает наилучшее возможное решение с точки зрения сложности времени, то есть O(k).Во-первых, обратите внимание, что каждое название фильма связано только с одной частотой, а каждая частота связана (вероятно) только с одним именем фильма.А поскольку вы хотите получать названия фильмов на основе частот, у хэш-карты нет преимущества перед линейным набором пар имя-частота, таких как вектор или связанный список.Затем обратите внимание, что каждый год и каждый жанр (независимо) связаны с несколькими фильмами (каждый из которых имеет название и частоту).Таким образом, здесь есть место для хэш-карты: для данного года и данного жанра структура, подобная хэш-карте, даст вам подходящие фильмы в ожидаемое постоянное время.

Объедините эти два результата, и вы получите хэш-карту с годами.и жанры в качестве ключей и коллекции пар имя-частота в качестве значений.Единственное улучшение, которое позволяет извлекать k большинство потоковых фильмов за данный год и жанр в O(k) сложности времени, является своего рода: если ваши пары имя-частота сортируются по частоте в каждой коллекции, вы можете просто вернутьfirst (или last, в зависимости от порядка) k names.

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

...