Ищем эффективный метод для извлечения элементов хеш-таблицы в один массив

1

Я создал собственную реализацию хэш-таблицы, в которой связанный список хранится в каждой записи массива (размер которого равен 11). Я пытаюсь извлечь элементы хеш-таблицы в один массив, а затем отсортировать массив элементов. Я подумал о том, чтобы просто извлечь каждый связанный список в результирующий массив и затем отсортировать массив позже. Как показано ниже в методе

//turns the whole hash table into an array
    private int[] toArray() {
        int sizeOfArray = 0;
        for(int i=0; i<11; i++)
        {
            //calculate the total number of elements in the hashTable
            sizeOfArray += hashMap.getList(i).size();
        }

        int[] result = new int[sizeOfArray];

        int indexRes = 0;
        //import every entry from the hash table into a single array
        for(int i=0; i<11; i++)
        {
            KeyValuePairLinkedList list = hashMap.getList(i);

            //convert the list to an array
            int[] listArray = list.toArray();
            for(int j=0; j<list.size(); j++)
            {
                result[indexRes] = listArray[j];
                indexRes++;
            }
        }
        return result;
    }

Но если элементы в каждом связанном списке уже отсортированы, тогда я мог бы просто объединить элементы в один массив, подобно тому, как алгоритм сортировки слияния объединяет два массива, однако я бы объединил 11 массивов, а не только 2, и я предполагая, что это потребует много кода.

Кроме того, скажем, я хотел извлечь только целые числа, хранящиеся в моей хэш-таблице, которые являются четными, а затем отсортировать эти целые числа в результирующем массиве. Я мог бы использовать тот же метод снова, извлекая всю хэш-таблицу в один массив, а затем удаляю нечетные целые числа, а затем сортируем. Но должен быть лучший способ сделать это.

  • 1
    Каков средний размер каждого связанного списка? Если они маленькие, то их объединение не принесет особой выгоды.
  • 2
    Посмотрите здесь некоторые идеи о N-способе слияния: stackoverflow.com/questions/5055909/algorithm-for-n-way-merge
Показать ещё 1 комментарий
Теги:
performance
linked-list
hashtable
mergesort

1 ответ

1

один способ сделать это, если массивы уже отсортированы

  • построить минимальную кучу первого элемента в каждом массиве
  • выберите минимум, поместите в последний массив + вычеркните следующий элемент и вставьте в кучу

продолжайте делать это, пока не исчерпаете все массивы. каждый элемент в куче имеет значение + указатель на какой массив и какой индекс он есть.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню