C++ 什么时候有太多的动态数组是危险的?
我目前正在为一项关于城市和桥梁的任务编写代码。我必须在其受尊重的地区打印城市和桥梁,例如:C++ 什么时候有太多的动态数组是危险的?,c++,arrays,dynamic,disjoint-sets,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
//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)存储到一个数组中,然后通过程序对它们进行排序和组织。问题是我可能有超过500000条来自用户的路径。我想创建500k动态阵列。这会导致严重的内存问题吗 我已经研究了其他可能的解决方法,比如kruskal算法和不相交集(我认为是最有用的)。我很难理解不相交集的编码,我想我尝试一种我更熟悉的方法 在存储值、比较和组织它们的位置上提供任何帮助都将非常有用。链接到我阅读有关这方面信息的地方会有所帮助。过去几天我读了很多书。没有多大帮助 总而言之,我的问题是:
- 500k动态阵列会导致内存方面的严重问题吗
- 在给定路径的情况下,在何处存储值并比较和组织它们
我从一个包含这3个字段的结构/类开始,然后使用其中的
std::vector
。这将把所有值存储为一个连续的分配。比较而言,创建、搜索和分配的速度非常快。一般来说,假设您的应用程序有2 Gig的内存,12字节的500K记录(假设您使用32位作为值)不会有问题。例如,如果希望减小数据集大小,可以使用以下数据格式:
查看城市集的大小(城市数量),以及两个城市之间的最大长度
此外,像索引城市对(A-B成为对ID)这样的事情也可以减少数据集 这可能与你的问题没有直接关系,但我认为你想要实现的是-。如果将图形建模为邻接矩阵,则不需要分配500k个动态数组。考虑以下格式来存储数据:
int city_map [MAX_NO_OF_CITIES][MAX_NO_OF_CITIES];
city_map[i][j] = length_of_brigde_connecting_city_i_to_j;
这样存储500000条条目只需要略多于1MB的内存。“问题是我可能有超过500000条来自用户的路径。”,你的意思是希望用户通过控制台输入500k路径吗?这可能是通过一个文件。@Singeroffall:很可能导师会使用类似于
cat problem\u instance1 | user\u writed\u program
@Zeta的东西,我希望是这样,但我想我最好问清楚;)当你有std::vector
时,为什么要使用动态数组?哎呀,忘了提一下,我不允许在STL中使用任何东西。一切都必须由我自己编码。@Chris然后你可以使用这些500k记录的数组(或者不管你需要多少)来完成相当于vector
。只是避免在堆栈上分配它。
int city_map [MAX_NO_OF_CITIES][MAX_NO_OF_CITIES];
city_map[i][j] = length_of_brigde_connecting_city_i_to_j;