Мои data
хранятся в векторе пользовательских объектов, и в этом конкретном программном обеспечении меня интересуют те, которые interesting
.Таким образом, у меня есть std::vector<size_t> interesting;
, где я храню их индексы, так что когда я вызываю data[ interesting[i] ]
, я получаю i-й интересный объект данных.
Мне нужно указать здесь, что interesting
является несортированный вектор индексов, так что на данный момент нет никакого хитрого трюка, который я мог бы использовать с упорядочением элементов в оригинале data
...
Теперь к проблеме:Данные интересны, потому что они имеют либо свойство A
, B
, либо оба, и мне нужно сохранить значение этого свойства (скажем, простое double
) в другом векторе для быстрого поиска.
Интересно, как бы я поступил об этом!Какую структуру я должен использовать для свойств?
Скажите data.size() = 100
и interesting.size() = 90
(намного больше, но проще работать с круглыми числами), и удаление «неинтересных» данных не вариант, потому что онииспользуются другими частями программного обеспечения.В частности, мне нужно иметь возможность выполнять быстрый поиск, ни data
, ни interesting
не изменятся в размерах при запуске программного обеспечения (будут работать только значения данных), поэтому вставка в структуры является единовременной в начале и выигрываетне влияют на производительность так, как поиск будет.
У меня есть два решения, которые приходят на ум:
Я мог бы использовать std::unordered_map<size_t,double> A
и аналогичные для B для храненияпары индекс-свойство, поэтому я могу искать, используя A.at(interesting[i])
, чтобы получить значение свойства A
для i-го интересного элемента.Поскольку на этом этапе больше не будет вставок, могу ли я с уверенностью предположить, что это O (1)?Это был бы мой предпочтительный способ.
Я мог бы выделить std::vector<double> A ( data.size() );
для хранения этих значений и просто вызвать A[ interesting[i] ]
, как я делаю для данных;это обеспечивает быстрый поиск, но я бы:
- тратил МНОГО памяти при увеличении размера
data
... на самом деле я бы потратил объединенные data.size()
элементы, если предположить, что нетперекрытия.На данный момент A
и B
являются просто double
, но если в какой-то момент мне нужно изменить их тип на нечто большее ... Я предполагаю, что разреженного вектора с поиском O (1) не существует, верно? - Здесь нет обязательной проверки, и не дай бог, я пойду и найду
A[3]
, а 3
- неинтересный показатель!Мне нужно было бы добавить мои собственные накладные расходы на проверку, которые, вероятно, приведут к тому, что поиск больше не будет таким быстрым ...
Короче говоря: меня интересуют данныеструктура для свойств A
и B
, чтобы я мог получить доступ к этим значениям [которые определены только для interesting
точки данных] и знать, какому значению data
они также соответствуют ...
Кто-нибудь может придумать хорошее решение этой проблемы?Надеюсь, я достаточно ясно дал понять!
Комментатор попросил пример кода, у меня нет работы, так как я не выяснил, какую структуру данных использовать, но в идеале я бы просто хотелделать
std::vector<MyObject> data;
// ...
// get data and do stuff
// ...
std::vector<size_t> interesting;
// ...
// initialise interesting as a vector of indexes that refer to the data
// ...
// Now initialize the A property DS
std::vector<double> A ( data.size() ); // <--- this is what I'm questioning about
// maybe I'm better off with std::unordered_map<size_t,double> A ?
// so that (once initialised) I can quickly do
size_t i = 5;
std::cout << "Data point " << data[ interesting[i] ] <<
" has a property A's value of " << A[ interesting[i] ] << std::endl;
// for evey i I want