XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
[Hashtable]Небольшая заметка
В обычных языках, таких как C#, C++ и тд, хештаблица представляет собой объект, который может хранить объекты в виде:
hastTable<ключ, значение>
Т.е. по сути одномерный массив.
Но как вы все знаете, jass hashtable представляет собой следующую конструкцию:
hashTable<ключ1, ключ2, значение>
Т.е. двумерный массив.
Весь прикол в том, что близовская хештаблица просто напросто является хештаблицей, которая по адресу ключ1 хранит другую хештаблицу, которая принимает ключ2 и возвращает значение. Собственно что это нам дает? Да в принципе ничего особенного, кроме пары мелочей:
  1. Нет прямой адресации к данным. на что нам впринципе пофиг
  2. При правильной адресации данных можно сэкономить память и не плодить лишние объекты хорошая новость для байтофагов \o/
Впрочем экономия элементарна и очевидна. Собсно опустим лирику, показываю код:
Дано:
 ht  // инициализированная хештаблица в кол-ве 1 штука
 players[12]   //игроки в кол-ве - 12 штук
 params[100]  //параметры которые нужно сохранить для каждого игрока в количестве 100 штук
Задача:
сохранить
Все просто и тривиально:
Как НЕ правильно сохранять ну, скорее не оптимально
for(int pId = 0; pId < 12; pId++)
{
	for(int paramId = 0; paramId < 100; paramId++)
	{
		SaveInteger(ht,paramId, pId,params[paramId]);
	}
}
» для тех кому данный пример не будет не убедителен
Можете посмотреть мою ObjectData, там допущена эта ошибка я раньше так же не задумывался :) На каждый объект создается целый экземпляр объекта ХТ, а это дико не оптимально. Можно было бы сделать тоже самое используя 3 хт(1 парент и 2 чайлда); Как я говорил, это не смертельно, однако не стоит раскидываться объектами, ибо каждый из них имеет множество методов и свойств.
В целом в таком использовании нет ничего смертельного, однако хочу подчеркнуть, что используя таким способов ХТ вы создаете огромное кол-во лишних объектов. В данном случае целых 88!
Как вы уже догадались будет правильно следующее заполнение хт
for(int pId = 0; pId < 12; pId++)
{
	for(int paramId = 0; paramId < 100; paramId++)
	{
		SaveInteger(ht, pId,paramId,params[paramId]);
	}
}
Будет создано 12 объектов.
Ну и так и быть, расскажу 3-ю мелочь :)
Следуя примеру близов, при желании мы можем создать массив любой мерности так как есть следующая нативка
native SaveHashtableHandle takes hashtable table, integer parentKey, integer childKey, hashtable whichHashtable returns boolean
Впрочем я надеюсь не для кого не открыл Америку :)
Пример писать не буду, думаю и сами справитесь, т.к. это совершенно очевидно =)
PS: в принципе можно тему перекинуть в обучающие статьи.
Старый 05.09.2012, 21:20
Doc

offline
Опыт: 63,163
Активность:
Так и думал. Честно, понял то, о чем будет написано еще на первом предложении :D
Старый 05.09.2012, 21:22
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Doc, ну эта статья для раскрытия очевидного, ибо оно все на столько очевидно, что некоторые даже не задумываются =)
Старый 05.09.2012, 21:25
ScorpioT1000
Работаем
offline
Опыт: отключен
SaveInteger(ht, 0,pId+ pId*paramId),params[paramId]);
ВНЕЗАПНО всего 1 хт

Отредактировано ScorpioT1000, 05.09.2012 в 21:31.
Старый 05.09.2012, 21:25
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ScorpioT1000:
SaveInteger(ht, 0, pId+(paramId*pId),params[paramId]);
ВНЕЗАПНО всего 1 хт
2 :) Парент ХТ + Чайлд ХТ.
А так да, тоже вполне хороший пример, хотя это уже крайности :)
Старый 05.09.2012, 21:28
adic3x

offline
Опыт: 108,439
Активность:
Весь прикол в том, что близовская хештаблица просто напросто является хештаблицей, которая по адресу ключ1 хранит другую хештаблицу, которая принимает ключ2 и возвращает значение.
Откуда информация?
Старый 05.09.2012, 23:37
ScorpioT1000
Работаем
offline
Опыт: отключен
native  FlushChildHashtable					takes hashtable table, integer parentKey returns nothing
native  FlushParentHashtable						takes hashtable table returns nothing
отсюда
Старый 05.09.2012, 23:40
DioD

offline
Опыт: 45,134
Активность:
ктонить game.dll декомпилировал то?
и вообще в нормальных языках хранится HT<OBJECT, OBJECT> но никак не ключзначение, соответственно и кучу параметров хранить не надо, хранится ОДНА единственная ссылка на объект который хранит в себе всё что надо.
а в еще более нормальных языках пишут extends blabla и накидывают нужные поля.
Старый 06.09.2012, 12:49
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
А теперь посмотри еще раз на предыдущий пост :|
Ну или удачи декомпилировать game.dll, ибо без этого все это лишь необоснованные предположения.
Старый 06.09.2012, 13:54
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Faion:
Ну или удачи декомпилировать game.dll, ибо без этого все это лишь необоснованные предположения.
В том числе и твоё.
Старый 06.09.2012, 14:16
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Clamp:
В том числе и твоё.
Мое вполне обосновано. Для особо упоротых
Старый 06.09.2012, 14:22
adic3x

offline
Опыт: 108,439
Активность:
Faion, судите о принципе работы функции по ее названию?
Старый 06.09.2012, 15:07
ScorpioT1000
Работаем
offline
Опыт: отключен
ADOLF, покажи мне пример, чтобы можно было уничтожить все значения по первому ключу, равному s, не затрагивая другие первые ключи.
Если там конкатенация k1+k2 или чтото вроде hash(hash(k1)+hash(k2)), то выполнить вышеуказанную операцию будет невозможно.
Старый 06.09.2012, 15:14
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ScorpioT1000:
покажи мне пример, чтобы можно было уничтожить все значения по первому ключу
Причем что бы это было проще чем просто сделать хт, валью которой другая хт :nate:
нет, вы серьезно думаете, что близы утруждались при реализации хт? Да они сделали что попроще, и забыли.
Старый 06.09.2012, 15:19
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Faion, ну уж не совсем что попроще, так что то среднее, то у хт есть такая проблема как коллизия, они ей как то же решили...
кеш они доделовать точно не захотели
Старый 06.09.2012, 15:23
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
quq_CCCP, а кто сказал что проблемы с коллизией решены? Согласно некоторым тестам, скорость доступа изменяется в зависимости от кол-ва данных в ХТ, это говорит о том, что коллизия непофикшена. впрочем лично я это не проверял.
Старый 06.09.2012, 15:32
ScorpioT1000
Работаем
offline
Опыт: отключен
коллизию нельзя "пофиксить", потому что входной ключ может быть любой длины, а размерность итогового ключа стремится (при гуд хешфункции) к максимально доступному числу ячеек в хт
Старый 06.09.2012, 15:34
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Faion, ну если бы не пофикшена совсем то это было бы чревато жуткими багами при использовании хт... тем более у хт есть какой то предел размерности, только вот какой для меня загадка...
quq_CCCP добавил:
ScorpioT1000:
коллизию нельзя "пофиксить", потому что входной ключ может быть любой длины, а итоговый ключ равен числу ячеек в хт
Можно если все ключи будут известны заранее и не будут меняться, ну или оч редко....
Старый 06.09.2012, 15:37
YellowStar
poon
offline
Опыт: 15,144
Активность:
пффф.

юзаю Table, не парю мозг своими рассуждениями другим.

8190 инстансов создаются легко, и крепятся к одной хештаблице.

8190 инстансов, заполнить невозможно даже если использовать их не арционально для каждого объекта...
Старый 06.09.2012, 15:46
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
YellowStar, ну если не поставить себе такую цель как забить целиком)
Но по делу, в большинстве случаев и 30% не забивается...
Старый 06.09.2012, 15:52
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:56.