我已接近我为大学课程编写代码的程序的结尾,但我遇到了最后的麻烦:格式化输出!
这与代码无关:这只是化妆品(但我需要解决这个问题,因为我的输出必须遵守一些标准)。
基本上,我的程序将读取.csv文件,并通过将结果图分成簇来处理该文件。我想让它们编号,无论如何(只要数字是正确的,我不在乎它是以2而不是1开头)。问题是我无法弄清楚如何做O-o
我已经有了一个合适的数据结构来处理我的聚类活动:图中的每个节点都指向一些列表。如果我有n个集群,我将有n个列表。这些列表在Vertex类中实例化,算法会在运行时将它们合并,所以我不能像我一样简单地对它们进行编号,无论它们是在向量中还是其他东西。
所以现在我有n个列表。我可以通过查看第一个顶点(它们位于向量V中)并跟随指针轻松开始。 在这之后,我在第一个列表中。我可以继续前进并将每个节点指向该列表,我希望我的程序在地图上放置一个“1”。 然后我会在V里找到另一个列表与之前不同的顶点,再次到达列表并用“2”保存节点,依此类推。
我的计数器无法正常工作:在.csv文件中要求3个群集,输出如下:
c 1 1
c 2 1
c 3 1
c 4 1
c 5 1
c 6 5
c 7 1
c 8 1
c 9 1
c 10 1
c 11 1
c 12 5
c 13 5
c 14 1
c 15 1
c 16 1
c 17 1
c 18 17
c 19 17
c 20 17
c 21 17
c 22 5
c 23 17
c 24 17
c 25 17
c 26 17
c 27 17
c 28 17
c 29 17
c 30 17
c 31 5
c 32 5
群集标签为1, 5, 17
而不是1, 2, 3
lol U_U
map<int, int> clusterProcessor(Grafo &G, map_t &Map, int clusters, vector<Vertex*> &V {
map<int, int> clustermap;
list<Vertex*>::iterator listiter;
int j;
int counter = 1;
for (j=1; j < V.size(); ++j) {
if (V[j]->getMyset()->front() != V[j-1]->getMyset()->front())
counter++;
for (listiter = V[j]->getMyset()->begin(); listiter != V[j]->getMyset()->end();
listiter++)
clustermap.insert(pair<int, int> ( (*listiter)->id, counter) );
}
return clustermap;
}
void clusterPrinter(map<int, int> m) {
map<int, int>::iterator i;
for (i = m.begin(); i != m.end(); i++)
cout << "c " << i->first << " " << i->second << endl;
}
答案 0 :(得分:1)
只需在输出时尝试重新编号。保留您之前看过的顶点地图以及它们的新数字。在打印顶点编号之前,如果您以前看过它,只需打印您已经给它的新编号。如果它是一个新的顶点,请为其指定一个新数字,在地图中记录,并使用其新数字。
答案 1 :(得分:1)
请注意,该数字始终是它出现之前的行的行号。这表明counter++
始终在执行。
果然,确实如此。
也许您打算比较每个集群的第一个元素的值,而不是迭代器地址?
根据您建立的后续映射,我建议更改
if (V[j]->getMyset()->front() != V[j-1]->getMyset()->front() ) counter++;
到
if (V[j]->getMyset()->begin()->id != V[j-1]->getMyset()->begin()->id) counter++;
答案 2 :(得分:0)
好的,有更好的东西。我没有使用另一张地图,而是保留了一个bool矢量。
它工作得很好,因为我还有一个我无法摆脱的微小虫子。我会粘贴代码和输出。
代码:
map<int, int> clusterProcessor(Grafo &G, map_t &Map, int clusters, vector<Vertex*> &V) {
map<int, int> clustermap;
list<Vertex*>::iterator listiter;
int j;
int counter = 1;
vector<bool> checkvertex(V.size(), false); // Got 1 bool per each vertex. When I visit it, it'll be set "true".
for (j=1; j < V.size() ; ++j) {
//if (V[j]->getMyset()->front() != V[j-1]->getMyset()->front() ) count++;
if (checkvertex[j] == false) {
for (listiter = V[j]->getMyset()->begin(); listiter != V[j]->getMyset()->end(); listiter++)
{
clustermap.insert(pair<int, int> ( (*listiter)->id, counter) );
checkvertex[(*listiter)->id-1] = true;
}
counter++;
}
}
return clustermap;
}
输出: c 1 1 c 2 1 c 3 1 c 4 1 c 5 1 c 6 2 c 7 1 c 8 1 c 9 1 c 10 1 c 11 1 c 12 2 c 13 2 c 14 1 c 15 1 c 16 1 c 17 1 c 18 3 c 19 3 c 20 3 c 21 3 c 22 2 c 23 3 c 24 3 c 25 3 c 26 3 c 27 3 c 28 3 c 29 3 c 30 3 c 31 2 c 32 2
这就是我想要的,但我试图在它的极限检查它。当我问他32个星团时会发生这种情况:第一个顶点就消失了! O.o
c 2 1 c 3 2 c 4 3 c 5 4 c 6 5 c 7 6 c 8 7 c 9 8 c 10 9 c 11 10 c 12 11 c 13 12 c 14 13 c 15 14 c 16 15 c 17 16 c 18 17 c 19 18 c 20 19 c 21 20 c 22 21 c 23 22 c 24 23 c 25 24 c 26 25 c 27 26 c 28 27 c 29 28 c 30 29 c 31 30 c 32 31
有趣的事实是它不会仅在其极限发生:对于这个文件,任何大于13的数字都会发生(13仍然没问题)。