什么时候动态数组太多会很危险?

时间:2012-11-12 06:09:44

标签: c++ arrays dynamic disjoint-sets

我目前正在为处理城市和桥梁的作业编写代码。我必须在他们受人尊敬的地区打印城市和桥梁,例如:

//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算法和不相交集(我认为最有用)。我很难理解不相交集的编码,我想我尝试了一种我更熟悉的方式。

有关存储值的位置以及比较和组织它们的任何帮助都会很棒。链接到我阅读有关此信息的地方会有所帮助。过去几天我读了很多。没多大帮助。

总结一下,我的问题是:

  • 500k动态数组是否会在内存方面造成严重问题?
  • 在哪里存储值并根据路径比较和组织它们?

3 个答案:

答案 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以上的内存。