powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Организовать хеш-таблицу с открытой адресацией
16 сообщений из 16, страница 1 из 1
Организовать хеш-таблицу с открытой адресацией
    #39970649
ПётрРедин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Организовать хеш-таблицу с открытой адресацией, используя процедуру поиска и вставки по ключу. Для формирования начального хеш-адреса использовать метод деления, а затем при возникновении коллизии процедуру квадратичного исследования.Помогите пжл с заданием.
Есть код, но помогите довести до ума, так как я с java никогда не работал:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
public class HashEntry {
      private int key;
      private int value;
      HashEntry(int key, int value) {
            this.key = key;
            this.value = value;
      }
      public int getValue() {
            return value;
      }
      public void setValue(int value) {
            this.value = value;
      }
      public int getKey() {
            return key;
      }
}
public class DeletedEntry extends HashEntry {
      private static DeletedEntry entry = null;
      private DeletedEntry() {
            super(-1, -1);
      }
      public static DeletedEntry getUniqueDeletedEntry() {
            if (entry == null)
                 entry = new DeletedEntry();
            return entry;
      }
}
public class HashMap {
      private final static int TABLE_SIZE = 128;
      HashEntry[] table;
      HashMap() {
            table = new HashEntry[TABLE_SIZE];
            for (int i = 0; i < TABLE_SIZE; i++)
                  table[i] = null;
      }
      public int get(int key) {
            int hash = (key % TABLE_SIZE);
            int initialHash = -1;
            while (hash != initialHash
                        && (table[hash] == DeletedEntry.getUniqueDeletedEntry() || table[hash] != null
                                   && table[hash].getKey() != key)) {
                  if (initialHash == -1)
                        initialHash = hash;
                  hash = (hash + 1) % TABLE_SIZE;
            }
            if (table[hash] == null || hash == initialHash)
                  return -1;
            else
                  return table[hash].getValue();
      }
      public void put(int key, int value) {
            int hash = (key % TABLE_SIZE);
            int initialHash = -1;
            int indexOfDeletedEntry = -1;
            while (hash != initialHash
                        && (table[hash] == DeletedEntry.getUniqueDeletedEntry() || table[hash] != null
                                   && table[hash].getKey() != key)) {
                  if (initialHash == -1)
                        initialHash = hash;
                  if (table[hash] == DeletedEntry.getUniqueDeletedEntry())
                        indexOfDeletedEntry = hash;
                  hash = (hash + 1) % TABLE_SIZE;
            }
            if ((table[hash] == null || hash == initialHash)
                        && indexOfDeletedEntry != -1)
                  table[indexOfDeletedEntry] = new HashEntry(key, value);
            else if (initialHash != hash)
                  if (table[hash] != DeletedEntry.getUniqueDeletedEntry()
                             && table[hash] != null && table[hash].getKey() == key)
                        table[hash].setValue(value);
                  else
                        table[hash] = new HashEntry(key, value);
      }
      public void remove(int key) {
            int hash = (key % TABLE_SIZE);
            int initialHash = -1;
            while (hash != initialHash
                        && (table[hash] == DeletedEntry.getUniqueDeletedEntry() || table[hash] != null
                                   && table[hash].getKey() != key)) {
                  if (initialHash == -1)
                        initialHash = hash;
                  hash = (hash + 1) % TABLE_SIZE;
            }
            if (hash != initialHash && table[hash] != null)
                  table[hash] = DeletedEntry.getUniqueDeletedEntry();
      }
}

...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39970669
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А этот цикл когда-нибудь остановится?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
           
            while (hash != initialHash
                         && (table[hash] == DeletedEntry.getUniqueDeletedEntry() || table[hash] != null
                                    && table[hash].getKey() != key)) {
                  if (initialHash == -1)
                        initialHash = hash;
                  if (table[hash] == DeletedEntry.getUniqueDeletedEntry())
                        indexOfDeletedEntry = hash;
                  hash = (hash + 1) % TABLE_SIZE;
            }
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39970735
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага вижу. Вот это правило обепечит останов. Слово hash сбивает с толку.

Код: java
1.
hash != initialHash
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39970905
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПётрРедин
Есть код, но помогите довести до ума

Боюсь, что довести этот код до ума можно только полным удалением.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39970951
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно. Какая помощь нужна от нас?

В теории - никто не будет просматривать код глазами в поисках доказательства правоты.
И вряд-ли кто-то станет это компилировать. Щас вообще половина людей читают sql.ru
через мобильное устройство. Сами понимаете....

Автору надо просто взять JUnit, и написать хотя-бы 3 теста которые покрывают put/get/remove
для простой таблички на 3 ключа. Я думаю этого достаточно чтоб покрыть 99% функционала.

И еще автору можно ради примера посмотреть на библиотечку trove. Кажется она оперировала
примитивными типами и должна поддерживать режим "открытой адресации"
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39971225
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В теории - никто не будет просматривать код глазами в поисках доказательства правоты.

Я и просмотрел. Этот код вообще творит какую-то дичь, обращаясь с хэш-таблицей как с фрагментированным связанным списком.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39971264
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
mayton
В теории - никто не будет просматривать код глазами в поисках доказательства правоты.

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

Я не смотрел. Не интересно.

Интересно просто рассмотреть такие worst-cases, которые в обычной табличке HashMap на базе бакетов со списками
просто невозможны.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39971285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тут как? При 100% заполнении массива. Чтобы определить что ключа 100% нет в хешмапе
при неудачном раскладе мы обойдем весь хешмап?
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39971399
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Чтобы определить что ключа 100% нет в хешмапе
при неудачном раскладе мы обойдем весь хешмап?

Да. Хотя все вменяемые люди обходят только список коллизий.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39971402
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
mayton
Чтобы определить что ключа 100% нет в хешмапе
при неудачном раскладе мы обойдем весь хешмап?

Да. Хотя все вменяемые люди обходят только список коллизий.

А в какой момент мы поймем что цепочка завершилась? Ведь цепочка (виртуальная цепочка
которую мы подразумеваем для метода открытой адресации) не имеет явного терминатора
и если мы на каком-то шаге неступаем на левый key - означает ли это что наша цепочка прервана
или просто этот левый key был "удачно" вставлен при 99% загрузке всех свободных слотов массива?
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39972415
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
подразумеваем для метода открытой адресации

Виноват, признаю свою ошибку. Никогда до этого не слышал о методе открытой адресации.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39972419
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И слава богу. Я этот метод изучал еще в университете. И пожалуй .. видел его в книге
Седжвика - Фундаментальные Алгоритмы 1-4

У него есть одно преимущество. Он может использовать массив примитивов int (например) для ключей и значений.
И заполнить его на 100%. Но при этом у нас должен быть договорняк о том что какая-то константа
например MIN_INT обозначает NULL или пустое значение. К сожалению автор обошёл это со стороны
просто вводя массив

Код: java
1.
HashEntry[] table;



и это преимущество в компактности было потеряно.

Чуть позже я сфоткаю иллюстрацию с книги седжвика. Там были показаны disadvantages открытой адресации
для linear probes и двойного хеша.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39972713
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ладно, я уже почитал в википедии что это за зверь. Вопрос на проверку: вместимость такой хэш-таблицы реально ограничена размером массива?
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39972721
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... хороший вопрос. Дай порассуждаю. Т.к. у меня тоже есть сомнения на этот счет.
Для метода линейных проб (linear probes) в случае 1-й неудачи мы должны повторять
алгоритм генерации следующего номера ячейки как взаимно-простое число с размером
таблицы. Документация пишет что взаимно-простое - нужно для гарантии того что каждая
ячейка-слот будет просмотрена хотя-бы 1 раз.

Например для размера size=20 я могу взять взаимно простое число 3 и если хеш=15
то следующий слот будет (15 + 3) MOD 20 = 18, потом (18 + 3) MOD 20 = 1 и так далее.

Из этого я себе так понимаю что критерий останова - это просмотр всех слотов.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39976094
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кусок книги Роберта Седжвика.
...
Рейтинг: 0 / 0
Организовать хеш-таблицу с открытой адресацией
    #39976267
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dimitry Sibiryakov
пропущено...

Да. Хотя все вменяемые люди обходят только список коллизий.

А в какой момент мы поймем что цепочка завершилась? Ведь цепочка (виртуальная цепочка
которую мы подразумеваем для метода открытой адресации) не имеет явного терминатора
и если мы на каком-то шаге неступаем на левый key - означает ли это что наша цепочка прервана
или просто этот левый key был "удачно" вставлен при 99% загрузке всех свободных слотов массива?

там будет не больше 8 коллизий - я думаю этим ребятам стоит верить)

пс.вообще мне бывает смешно - когда кафка 10 % теряет и это ок,а когда в мапу что то кладется и там народ парится за коллизию котоая в реальной жизни произодйтет 1 раз в сто лет)

ребаята потеря данных это нормально) - если вы не хотите их терять изайте коробочныне решения - но это стоит денег
если денег нет мей би ваши данные не на столько важны?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Организовать хеш-таблицу с открытой адресацией
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]