[Вопрос] Оптимизация поиска в листе
Доброго времени суток, уважаемые.
Ситуация. Есть лист, содержит данные произвольного типа. Код:
Type TObj 1 Способ Он же самый лёгкий. Первый способ это просто запустить цикл по листу и проверять NAME Код:
Function FindListElement(Name:String) Создать отдельный лист который будет содержать только строки, порядок элементов в листе строк, будет совпадать с порядком элементов в листе Objs. При добавлении данных в лист Objs , имя конкретного элемента будет добавляться в наш лист строк, при удалении удаляться. Таким образом мы сможем найти строку в "кэшированном" листе методом FindLast(), запомнить индекс элемента с таким именем, и по этому-же индексу получить элемент из первого листа Objs. Что лучше? |
Ответ: [Вопрос] Оптимизация поиска в листе
TMap - хеш таблица
Тобеж индексированый список. Располагается в модуле brl.map http://en.wikibooks.org/wiki/BlitzMa...tructures/Maps |
Ответ: [Вопрос] Оптимизация поиска в листе
То есть все равно придется вести два списка?
Или первый список полностью переделать на TMap? Я уже понял, что в этом случае данные можно будет искать посредством MapValueForKey Но что у нас с быстродействием? |
Ответ: [Вопрос] Оптимизация поиска в листе
Цитата:
Цитата:
Код:
Method _FindNode:TNode( key:Object ) За единственным исключением что тут нет листов в принципе. Тут структура сама по себе ориентирована на список "ключ":"Значение" Вообще по чаще заглядывай в модули: BlitzMax\mod\brl.mod\map.mod Там по коду можно сообразить что да как работает. Ну и кратенький пример использования: Код:
SuperStrict |
Ответ: [Вопрос] Оптимизация поиска в листе
Спасибо за наглядный пример.
Интересно а как занести в переменную скажем 200 элементов? =) Это-же все равно придется создавать массив, лист или такую структуру? И еще вопрос, если не возражаете, как можно обновить данные по ключу? тоже INSERT или сначала удалить ключ, а потом снова создать? Последний проблемный. |
Ответ: [Вопрос] Оптимизация поиска в листе
Цитата:
Цитата:
PHP код:
Цитата:
Код:
Local key:String = "Object39" Когда мы вызываем Remove удаляется не только ключ, но и значение. К сожалению тут происходит двойной поиск: map.Contains(key) и map.Remove(key) Этого можно избежать только работая напрямую с Node (звено хеш таблици) Примерно так: Код:
Local key:String = "Object39" Но с методами/переменными, которые начинаются с "_" надо поострожнее. Это так сказать стиль писания на BlitzMax так как в нём нет инкапсуляции - приватные методы и поля начинают с нижнего подчёркивания. |
Ответ: [Вопрос] Оптимизация поиска в листе
Вообще громандное спасибище!!! Будешь учавствовать в альфа-тесте игры? =)))
Даже больше незнаю чем и отблагодарить. =) Обидно что придется переписывать несколько десятков строк кода из-за такой вкусности. И все таки вернемся к быстродействию. В Итоге-то заносить, искать, обновлять данные в хеш-таблице быстрее чем в обычном листе, как думаете? |
Ответ: [Вопрос] Оптимизация поиска в листе
Цитата:
У нас тут есть раздел проектов на BlitzMax: http://forum.boolean.name/forumdisplay.php?f=106 Буду рад если ваша игра появится там. Цитата:
За такие копейки борьбу устраивать нет смысла - всё равно всё сожрёт рендер. |
Ответ: [Вопрос] Оптимизация поиска в листе
Спасибо, думаю тему можно закрыть
|
Ответ: [Вопрос] Оптимизация поиска в листе
brl.map - это не хэш таблица, там используются повороты влево/вправо, хэш таблица же при поиске высчитывает индекс ключа по его названию.
Насчет быстродействия - зря вы так, на таких задачках можно здорово потерять в производительности программы. 1) Если список обьектов не надо индексировать - тут идеально подойдут простые Листы. 2) Если индексировать надо - юзать индексированные списки. Насчет TList - официальное решение довольно грамотное, но... не безупречное, оно тоже довольно медленное, существует мой модуль API.List - это ускоренная версия TList'a, почти по всем параметрам быстрее стандартного, ищи его в теме "Ускоренный TList" под моим авторством. Насчет индексированного листа то BRL.MAP тоже далеко не оптимальное решение, существует модуль API.HASH - это настоящая хэш-таблица, и работает гораздо шустрее MAP'a, ищи его в моей подписи. |
Ответ: [Вопрос] Оптимизация поиска в листе
Вернемся к нашим таблицам.
Как организовать многомерный массив с данными разных типов? Мне нужно создать таблицу, столбцы которой разных типов, какой нибудь универсальный тип подскажите? А то для каждой таблицы создавать свой тип со своими полями надоедает. Пока что использую многомерный массив где все столбцы типа "строка", я просто сам запоминаю из какого столбца в какой тип переводить, но это-же не дело. |
Ответ: [Вопрос] Оптимизация поиска в листе
String - если нужно хранить Int, Float, Double, Short, Byte просто легко преобразовывать из них в него и обратно.
Object - для вообще всех данных включая String |
Ответ: [Вопрос] Оптимизация поиска в листе
Цитата:
|
Ответ: [Вопрос] Оптимизация поиска в листе
А что списка типов (структур/классов) в BlitzMax нету?
|
Ответ: [Вопрос] Оптимизация поиска в листе
Цитата:
Есть списки типов конечно же. Только вот у типа фиксированное количество столбцов, каждый столбец(поле) определенного типа. Таблиц у меня немерена куча, для каждой таблицы создавать отдельный тип как минимум - проблемно. |
Часовой пояс GMT +4, время: 05:16. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot