我目前正在为处理城市和桥梁的作业编写代码。我必须在他们受人尊敬的地区打印城市和桥梁,例如:
//unorganized inputs from user given the # of "paths" we need
4 // the # of paths
1 2 5 // 1 = city , 2 = city, 5 = bridge length
6 7 5 // 6 = city , 7 = city, 5 = bridge length
2 3 7 // 2 = city , 3 = city, 7 = bridge length
6 9 7 // 6 = city , 9 = city, 7 = bridge length
运行程序后,它将被排序为:
first district
1 2 5
2 3 7
2nd district
6 7 5
6 9 7
现在,我将通过cin阅读这些输入。我想将所有可能的路径(如1 2 5)存储到一个数组中,然后通过该程序对它们进行排序和组织。问题是我可能有超过500,000个来自用户的路径。我想创建500k动态数组。这会在记忆方面造成严重问题吗?
我已经研究了解决这个问题的其他可行方法,例如kruskal算法和不相交集(我认为最有用)。我很难理解不相交集的编码,我想我尝试了一种我更熟悉的方式。
有关存储值的位置以及比较和组织它们的任何帮助都会很棒。链接到我阅读有关此信息的地方会有所帮助。过去几天我读了很多。没多大帮助。
总结一下,我的问题是:
答案 0 :(得分:1)
500k动态数组是否会在内存方面造成严重问题?
没有问题,假设每个只是一个3个整数的数组。通常情况下,您会避免将此作为单独的分配,因为它过多 - 它会有点慢并且所需的簿记也会消耗相当多的内存。有一个更好的方法:
在哪里存储值并根据路径比较和组织它们?
我从一个包含这3个字段的struct / class开始,然后使用std::vector
个字段。这会将您的所有值存储为一个连续的分配。相比之下,创建,搜索和分配的速度非常快。
答案 1 :(得分:1)
一般情况下,假设你的应用程序有2个内存,那么50个12字节的记录(假设你的值使用32位)不会有问题。
如果您希望减少数据集大小,可以使用以下数据格式:
struct {
unsigned short city_a;
unsigned short city_b;
char length;
}
查看城市集的大小(城市数量)以及两个城市之间的最大长度。
另外,索引城市对(A-B成为Pair_ID)之类的东西也可以减少数据集。
答案 2 :(得分:1)
这可能与您的问题没有直接关系,但我认为您要完成的是 - http://en.wikipedia.org/wiki/Connected_component_(graph_theory)。如果将图形建模为邻接矩阵,则无需分配500k动态数组。请考虑以下格式来存储您的数据:
int city_map [MAX_NO_OF_CITIES][MAX_NO_OF_CITIES];
city_map[i][j] = length_of_brigde_connecting_city_i_to_j;
这样存储500,000个条目只需要1MB以上的内存。