有关邻接矩阵实现的问题
Question about adjacency matrix implementation
我在使用邻接矩阵的图形实现时遇到问题。作为一点背景,我必须从文件中读取包含演员,他们扮演的电影以及制作年份的每一行。我的工作是从文件创建一个图表。然后,该图将由演员的顶点组成,其边缘关系是他们一起出演同一部电影。在文件中,演员是顶点,电影和发行年份是边缘。 我找到了一种将顶点存储在 std::vector 中的方法,并且还创建了一个名为MovieInformation
的struct
来存储string movieName
和int movie year
。这些也存储在vector< pair< int,MovieInformation>>
中。
但是,我不知道如何将信息插入vector
中,以使演员的信息和他们主演的电影保持在一起。
该文件的示例输入是:
亚历克斯·威尔停止有意义1984 史蒂文·斯卡斯停止有意义1984 鲁本·刀片 无组织犯罪 1989 霍伊特·阿克斯顿 无组织犯罪 1989 弗雷德·格温 无组织犯罪 1989
而输出将是
(演员(--[电影#@year]-->(演员(--...
至于代码部分,除了上面解释的内容外,没有写太多。
首先,您需要简化顶点识别过程。我建议通过将它们存储在无序映射中来枚举它们,其中参与者名称作为字符串键,其相应的索引作为值。这将产生O(1)
预期时间来访问参与者的索引。然后,您可以形成包含出演同一部电影的演员索引的电影。当然,您还必须考虑电影的年份,因为可以有两部不同的电影,名称为M
,它们在不同的年份上映。一旦你形成了这些集合,那么你就会知道,对于对应于Y
年上映的电影M
的集合s
,s
中的所有顶点对之间都有一个边。
枚举过程类似于下面的代码。
void populate(vector<string>& actorNames, unordered_map<string, int>& indexMap) {
int nextIndexToAssign = 0;
for(int i=0; i < input.size(); ++i) {
if(indexMap.find(input[i]) == indexMap.end()) {
indexMap[input[i]] = nextIndexToAssign++;
}
}
}
运行类似于上述实现的代码后,您可以通过indexMap[actorName]
访问 actor 的索引,其中actorName
是存储 actor 名称的字符串变量。您可以对电影执行类似操作,其中关键将是pair<string, int>
而不是string
.
枚举完成后,您可以使用set
s 的向量作为存储桶来存储出演过同一部电影的演员。
typedef pair< string, pair<string, int> > InputLine;
vector<InputLine> input; // defined somewhere, has size N
...
M = movieIndices.size();
vector< set<int> > actorsInMovie(M);
for(int i=0; i < N; ++i) {
string& actor = input[i].first;
string& movie = input[i].second;
int actorIndex = actorIndices[actor];
int movieIndex = movieIndices[movie];
actorsInMovie[movieIndex].insert(actorIndex);
}
然后,您需要做的就是遍历该actorsInMovie
,并为actorsInMovie[i]
中u
和v
的每一对索引,在u
和v
之间留一个优势。
请注意,上面的代码尚未经过测试,并且由于问题语句中缺少任何源代码,因此仅用作伪代码。
考虑到输入线N
,可以有O(N)
电影和O(N)
演员。有了这些信息,我们可以说枚举边缘(即电影和年份对(将花费O(N)
预期的时间。此外,枚举每部电影并为每个电影形成一组电影需要O(N)
预期时间。在最坏的情况下,形成图形的边缘需要O(N*N)
时间,因为您需要在所有O(N)
演员对之间设置边缘。总的来说,即使你有一个unordered_map
的最坏情况的时间复杂度,在最坏的情况下,你最终的时间复杂度也会O(N*N)
。
邻接矩阵的细节不会改变该时间复杂度。你只需要用0
初始化N x N
矩阵adjacencyMatrix
的所有单元格,表示a
和b
的任何顶点之间都没有连接。然后,执行我上面介绍的枚举和分组(即集合(策略。最后,对于索引为i
和j
的每对 actor,您可以设置adjacencyMatrix[i][j] = adjacencyMatrix[j][i] = 1
。整体时间复杂度仍然O(N*N)
。由于分配和填充NxN
矩阵需要O(N*N)
时间和空间复杂性,因此这是您可能达到的最佳时间和空间复杂性,除非您为用例提供了任何其他详细信息/限制。
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++头文件和类实现出现问题
- 类继承,ENUM 与 AST 类实现的问题
- std::max() 函数与定点实现的比较中的问题
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在我的四叉树实现中遇到问题
- 涉及指针和手动实现的矩阵类的问题
- 有关邻接矩阵实现的问题
- 在 C++ 中实现简单链表时出现问题,没有输出
- 基于 SFINAE 的特征实现问题与函数模板重载
- MCS 锁定实现的问题
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 在我自己的堆栈中实现top的问题
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- C++中链表实现的问题
- c++在实现模板化嵌套类时遇到问题
- 简单的最大除数问题 c++ 实现抛出时间限制已超出
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 虚拟 CTOR 的克隆函数实现是否有问题