Помимо вопроса о домашней работе, вы бы использовали реляционную базу данных для
этот. Но это, вероятно, не поможет вам ...
Первое, что вам нужно выяснить, как уже указывали другие
out, сколько данных вы обрабатываете. O ( n ) перебор
достаточно быстро, пока n мало. Поскольку тривиальное количество данных будет
сделать это тривиальной задачей (положить в массив, и просто перебор
поиск), я предполагаю, что объем данных велик.
Хранение городов
Во-первых, ваши требования к поиску требуют данных, отсортированных в
несколько способов:
- Какой-то уникальный идентификатор города (имя?)
- Количество посетителей
Это на самом деле не так уж сложно удовлетворить. (1) проще всего. Хранить
города в каком-то массиве. Индекс массива становится уникальным идентификатором
(предположение: мы не удаляем города или, если мы удаляем города, мы можем
просто оставьте эту точку массива неиспользованной, тратя впустую немного памяти. Добавление в порядке).
Теперь нам также нужно найти наибольшее и меньшее количество посещений. Если предположить,
могут произойти изменения (например, добавление городов, изменение количества
посетители и т. д.) и заимствования из реляционных баз данных, я бы предложил
Создание индекса с использованием некоторой формы сбалансированного дерева. Базы данных будут
обычно используют B-дерево, но для вас могут подойти разные: check Википедия
статья на деревьях . В каждом узле дерева я просто держу указатель (или
индекс массива) данных города. Нет причин делать еще одну копию!
Я рекомендую дерево над хешем по одной простой причине: вы можете очень
легко сделать предварительный заказ или обратный порядок обхода, чтобы найти вершину или
нижние N предметов. Хэш не может этого сделать.
Конечно, если изменения могут не произойти, просто используйте другой массив (из
указатели на элементы, опять же, не дублируйте их).
Связывание городов с профилями
Как это сделать, зависит от того, как вы должны запрашивать данные, и какой формы
это может занять. Наиболее общим является то, что каждый профиль может быть связан
с несколькими городами, и каждый город может быть связан с несколькими
профили. Кроме того, мы хотим иметь возможность эффективно запрашивать
Направление - спросите обоих "кто посещает Феникс?" и "какие города делает Боб
посетить?».
Снова бесстыдно поднимаясь из баз данных, я бы создал другие данные
структура, довольно простая по направлениям:
struct profile_city {
/* btree pointers here */
size_t profile_idx; /* or use a pointer */
size_t city_idx; /* for both indices */
};
Итак, если сказать, что Боб (профиль 4) посетил Феникс (город 2), вы бы
profile_idx = 4
и city_idx = 2
. Сказать, что Боб посетил Вегас (город
1) Кроме того, вы бы добавили еще один, чтобы у вас было два из них для Боба.
Теперь у вас есть выбор: вы можете хранить их либо в дереве, либо
хэш. Лично я бы пошел с деревом, так как этот код уже
написано. Но хеш будет для O ( n ) вместо O (log n ) для поиска.
Кроме того, как мы сделали для подсчета посещений города, создайте индекс для
city_idx
так что поиск можно выполнить и с этой стороны.
Заключение
Теперь у вас есть возможность посмотреть 5 самых посещаемых городов (через
просмотрите индекс посещений города) и выясните, кто посещает эти
по городам в поиске для каждого города в индексе city_idx
, чтобы получить
profile_idx
. Хватайте только уникальные предметы, и у вас есть ответ.
О, и здесь что-то не так: кажется, что ваш инструктор хочет написать много кода за несколько часов!