Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
[Hashtable]Небольшая заметка
В обычных языках, таких как C#, C++ и тд, хештаблица представляет собой объект, который может хранить объекты в виде:
hastTable<ключ, значение> Т.е. по сути одномерный массив. Но как вы все знаете, jass hashtable представляет собой следующую конструкцию:
hashTable<ключ1, ключ2, значение> Т.е. двумерный массив. Весь прикол в том, что близовская хештаблица просто напросто является хештаблицей, которая по адресу ключ1 хранит другую хештаблицу, которая принимает ключ2 и возвращает значение. Собственно что это нам дает? Да в принципе ничего особенного, кроме пары мелочей:
Впрочем экономия элементарна и очевидна. Собсно опустим лирику, показываю код:
Дано:
Задача:
сохранить Все просто и тривиально:
Как НЕ правильно сохранять ну, скорее не оптимально
» для тех кому данный пример не будет не убедителен
Можете посмотреть мою ObjectData, там допущена эта ошибка я раньше так же не задумывался :) На каждый объект создается целый экземпляр объекта ХТ, а это дико не оптимально. Можно было бы сделать тоже самое используя 3 хт(1 парент и 2 чайлда); Как я говорил, это не смертельно, однако не стоит раскидываться объектами, ибо каждый из них имеет множество методов и свойств. В целом в таком использовании нет ничего смертельного, однако хочу подчеркнуть, что используя таким способов ХТ вы создаете огромное кол-во лишних объектов. В данном случае целых 88!
Как вы уже догадались будет правильно следующее заполнение хт
Будет создано 12 объектов.
Ну и так и быть, расскажу 3-ю мелочь :)
Следуя примеру близов, при желании мы можем создать массив любой мерности так как есть следующая нативка native SaveHashtableHandle takes hashtable table, integer parentKey, integer childKey, hashtable whichHashtable returns boolean
Впрочем я надеюсь не для кого не открыл Америку :)
Пример писать не буду, думаю и сами справитесь, т.к. это совершенно очевидно =)
PS: в принципе можно тему перекинуть в обучающие статьи. |
05.09.2012, 21:20 | #1
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Так и думал. Честно, понял то, о чем будет написано еще на первом предложении :D |
05.09.2012, 21:22 | #2
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
Doc, ну эта статья для раскрытия очевидного, ибо оно все на столько очевидно, что некоторые даже не задумываются =) |
05.09.2012, 21:25 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
SaveInteger(ht, 0,pId+ pId*paramId),params[paramId]);
ВНЕЗАПНО всего 1 хт Отредактировано ScorpioT1000, 05.09.2012 в 21:31. |
05.09.2012, 21:25 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
ScorpioT1000:
2 :) Парент ХТ + Чайлд ХТ.
А так да, тоже вполне хороший пример, хотя это уже крайности :) |
05.09.2012, 21:28 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Откуда информация? |
05.09.2012, 23:37 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
отсюда |
05.09.2012, 23:40 | #7
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ктонить game.dll декомпилировал то?
и вообще в нормальных языках хранится HT<OBJECT, OBJECT> но никак не ключзначение, соответственно и кучу параметров хранить не надо, хранится ОДНА единственная ссылка на объект который хранит в себе всё что надо.
а в еще более нормальных языках пишут extends blabla и накидывают нужные поля. |
06.09.2012, 12:49 | #8
+2/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
А теперь посмотри еще раз на предыдущий пост :|
Ну или удачи декомпилировать game.dll, ибо без этого все это лишь необоснованные предположения. |
06.09.2012, 13:54 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
Faion:
В том числе и твоё. |
06.09.2012, 14:16 | #10
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
|
06.09.2012, 14:22 | #11
+0/−4
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Faion, судите о принципе работы функции по ее названию? |
06.09.2012, 15:07 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
ADOLF, покажи мне пример, чтобы можно было уничтожить все значения по первому ключу, равному s, не затрагивая другие первые ключи. Если там конкатенация k1+k2 или чтото вроде hash(hash(k1)+hash(k2)), то выполнить вышеуказанную операцию будет невозможно. |
06.09.2012, 15:14 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
ScorpioT1000:
Причем что бы это было проще чем просто сделать хт, валью которой другая хт :nate:
нет, вы серьезно думаете, что близы утруждались при реализации хт? Да они сделали что попроще, и забыли. |
06.09.2012, 15:19 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,194Активность: |
Faion, ну уж не совсем что попроще, так что то среднее, то у хт есть такая проблема как коллизия, они ей как то же решили... кеш они доделовать точно не захотели |
06.09.2012, 15:23 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
quq_CCCP, а кто сказал что проблемы с коллизией решены? Согласно некоторым тестам, скорость доступа изменяется в зависимости от кол-ва данных в ХТ, это говорит о том, что коллизия непофикшена. впрочем лично я это не проверял. |
06.09.2012, 15:32 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
коллизию нельзя "пофиксить", потому что входной ключ может быть любой длины, а размерность итогового ключа стремится (при гуд хешфункции) к максимально доступному числу ячеек в хт |
06.09.2012, 15:34 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,194Активность: |
Faion, ну если бы не пофикшена совсем то это было бы чревато жуткими багами при использовании хт... тем более у хт есть какой то предел размерности, только вот какой для меня загадка...
quq_CCCP добавил: ScorpioT1000: Можно если все ключи будут известны заранее и не будут меняться, ну или оч редко.... |
06.09.2012, 15:37 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
пффф.
юзаю Table, не парю мозг своими рассуждениями другим. 8190 инстансов создаются легко, и крепятся к одной хештаблице. 8190 инстансов, заполнить невозможно даже если использовать их не арционально для каждого объекта... |
06.09.2012, 15:46 | #19
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,194Активность: |
YellowStar, ну если не поставить себе такую цель как забить целиком) Но по делу, в большинстве случаев и 30% не забивается... |
06.09.2012, 15:52 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|