前提:这个问题可能已经知道了,我可能会使用错误的措辞,如果是这种情况,请在别处推荐我。
快速问题概述:我必须存储大量的整数数组,以避免重复。我正在做以下事情:
LinkedList<int[]> ArraysAlreadyUsed;
使用数组后,我将其添加到列表中。在使用数组之前,我看看它是否在列表中。由于我需要使用许多高维数组,因此会遇到内存问题。
问题:为了最大限度地减少占用的内存量,有什么好/最好的方法? 有没有办法用哈希字符串表示这样的数组?这会更好吗?
答案 0 :(得分:2)
创建一个实现equals
和hashcode
的包装器可能是有意义的,这样您就可以将数组放在Set
中,用于O(1)contains
/ { {1}}。类似的东西:
add
然后你可以简单地使用一套:
public class IntArray {
private final int[] array;
private final int hash;
public IntArray(int[] array) {
this.array = array;
this.hash = Arrays.hashCode(this.array); //cache hashcode for better performance
}
@Override
public int hashCode() {
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final IntArray other = (IntArray) obj;
return Arrays.equals(this.array, other.array);
}
}
这将产生一个小的开销(每个包装器的估计少于20个字节),但是它的性能会比LinkedList好得多。
如果记忆是你唯一的问题,那么你可以选择Set<IntArray> arrays = new HashSet<> ();
,但这会更痛苦......
答案 1 :(得分:0)
如果您需要检查数据结构中是否存在元素,最佳解决方案是使用Map
。所以使用HashMap
。
元素的检索发生在 O(1)中。在列表(LinkedList
或ArrayList
)中,搜索在 O(n)中进行。
链接列表在内存占用方面也是一个糟糕的选择。事实上,每个元素都有对前一个元素的引用和对下一个元素的引用。
就内存占用而言,最好的解决方案是使用int(不是ArrayList
)数组,并引用最后插入的id。
答案 2 :(得分:0)
使用BitSet代替int[]
可能会减少内存占用。