我正在尝试创建邻接表。问题是我的实现在内存上花费了很多钱……
我阅读了一个单词文件,将它们添加到我的图形中并添加了图形的邻居
static public void createEdges(){
for(String string : words){ //words is the list of all the ~4 000 words that have been read
ArrayList<String> wordlist = new ArrayList<String>();
// ........................................................
//(irrelevant part where I create a new String "word" from "string")
// .........................................................
if (Contains(word) != null){ //Contains checks if the new String "word" is a part of the file I read.
wordlist.add(word);
}
list.put(string, wordlist); //list is of type: Hashtable<String, ArrayList<String>>; and represents the wordgraph where "string" is the node and "wordlist" is the neighbors of the node
}}
我认为可以节省内存的一种方法是不创建新的ArrayList evere循环,因为它会循环〜4000次...但是,我想不出任何好的方法来存储相邻节点。为我的目的注定要使用这种数据结构,还是有更聪明的方法来实现这一目的?
答案 0 :(得分:0)
我认为,如果编码正确,则您的方法不应占用过多的内存。您可以通过确保用要添加的元素初始化ArrayList来节省内存。这可能适用于您的算法,也可能无法适用。
确定所有值后,可能必须创建一个新的ArrayList,然后将结果复制到其中。这将减少列表将分配的多余容量。当阵列列表达到其内部容量时,它必须分配更多的内存。
这只会为每个ArrayList节省几个字节,因此仅当映射中有很多条目时才值得这样做。
ArrayList vs LinkedList from memory allocation perspective
要考虑的另一方面是String对象占用了多少空间。似乎您正在引用一个文件和一个单词列表。如果文件可以大字符串形式保留在内存中(最大大小为〜2GB),则所有.substring调用都只是进入该文件的“窗口”。如果要创建新的String对象,它将占用更多的内存。