2015-04-01 4 views
0

Помещение: Эта проблема может быть уже известна, и я могу использовать неправильную формулировку, пожалуйста, обратитесь ко мне в другом месте, если это так.Java: память эффективное хранение массивов целых чисел

Краткая информация об ошибке: Мне нужно хранить большое количество массивов целых чисел, чтобы избежать дублирования. Я делаю следующее:

LinkedList<int[]> ArraysAlreadyUsed; 

При использовании массива я добавляю его в список. Перед использованием массива я вижу, находится ли он в списке. Поскольку мне нужно использовать много массивов с большими размерами, я сталкиваюсь с проблемами памяти.

Вопрос: Что является хорошим/лучшим способом сделать это, чтобы свести к минимуму объем занимаемой памяти? Есть ли способ представления таких массивов с помощью хэш-строки? И будет ли это лучше?

+1

LinkedList - это плохой выбор как с точки зрения памяти, так и с точки зрения итерации. Вместо этого используйте ArrayList. Тем не менее, исчерпывающий линейный поиск массива кажется плохим началом. –

+0

Я не мог четко понять вашу проблему, но, похоже, вы можете решить свою проблему, если вы дадите свои возможности для использования hashmap для вашей ситуации. – Ravikiran763

+0

@ rave763 Как бы использовать хэш-карту в этом случае? что бы мне сопоставить мои массивы целого числа? – ZzKr

ответ

0

Если вам нужно проверить наличие элемента в структуре данных, лучшим решением является использование Map. Поэтому используйте HashMap.

Извлечение элементов происходит в O (1). В списке (LinkedList или ArrayList) поиск происходит в O (n).

Связанный список также является плохим выбором в период использования памяти. Infact для каждого элемента имеет ссылку на предыдущий элемент и ссылку на следующий элемент.

С точки зрения занятости, лучшим решением является использование массива int (не ArrayList) со ссылкой на последний вставленный идентификатор.

2

Это может иметь смысл создать оболочку, которая реализует equals и hashcode, так что вы можете поместить массивы в Set для O (1) contains/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); 
    } 
} 

Вы можете просто использовать набор:

Set<IntArray> arrays = new HashSet<>(); 

Это создаст небольшие накладные расходы (guestimate менее 20 байт на упаковке), но будет работать гораздо лучше, чем LinkedList.

Если память ваша единственная задача, то вы могли бы пойти на int[][], но это будет более болезненным ...

0

Использования вместо int[] в BitSet может уменьшить объем памяти.