Предположим, у меня есть N
вершины, помеченные от 0
до N-1
. Каждая вершина имеет не более 3
соседей и не менее 1
сосед. Предположим, что информация о соседстве сначала хранится в векторе с именем pairs
, где pairs[2*i]
и pairs[2*i+1]
представляют собой пару соседних вершин.Сохраните все соседи вершин, быстро найдите соседей вершин
Теперь мне нужно быстро найти то, что соседи за vertex[i]
, каков наилучший способ хранения этой информации?
Метод, который я придумал это:
объявить вектор называется
neighbors[3*N]
, так чтоneighbors[3*i+0]
neighbors[3*i+1]
иneighbors[3*i+2]
хранит три возможных соседей.почему говорят, потому что для каждой вершины не более трех соседей.
поэтому я инициализировать все элементы вектора
neighbors
кN
, что означает, что это не является допустимым соседом, так как вершины помечены от0
кN-1
.
Реализация кода выглядит следующим образом:
void get_neighbors(const std::vector<int>& pairs,
std::vector<int>& neighbors) {
int N = neighbors.size()/3;
int M = pairs.size()/2;
//init all the vertexes' neighbours to nothing
for (int i=0; i<3*N; ++i) {
neighbors[i] = N;
}
//loop through all the vertexes, and store their neighbors
for(int i=0; i<N; ++i) {
int j = 0;
//loop through pairs, and find out what neighbors vertex[i] has
for (int k=0; k < M; ++k) {
if(pairs[2*k]==i) {
neighbors[3*i+j]=pairs[2*k+1];
++j;
}
else if(pairs[2*k+1]==i) {
neighbors[3*i+j]=pairs[2*k];
++j;
}
}
}
}
Вещи, которые я чувствую себя некомфортно с моим методом:
объявить вектор
neighbors(3*N)
слишком много, так как многие из его элементов будет быть бесполезнымN
.Если я хочу посмотреть соседей
vertex[i]
«s, каждый раз, когда мне нужно проверить, еслиneighbors[3*i]==N
,neighbors[3*i+1]==N
иneighbors[3*i+2]==N
.
Используйте 'vector> graph (N);' для каждого ребра от 'a' до' b', то есть 'b' является соседом' a' и наоборот используется: 'graph [a]. push_back (b); 'Это объявит вектор элементов' N'. ** Чтобы получить соседей, поскольку есть только 3, всегда будет постоянное время. ** –
PRP
@PRP У вас есть время, чтобы написать это как ответ и дать некоторую ссылку о 'graph'? Я не знаком с символом '> graph (N)'? Ваш метод кажется достаточно чистым, но какое будет время поиска по сравнению с моим методом? – buzhidao
'vector>' будет иметь еще больше накладных расходов, чем один вектор 'neighbours'; если 3 * N элементов слишком много накладных расходов, то N 'vector ' s, безусловно, слишком много накладных расходов, так как это будет еще больше накладных расходов. –
immibis