Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизОптимальность Найти похожие ветки
← →
Igor_thief (2005-01-02 16:49) [0]Приветик мастера! С Новым Годом!
Есть у меня определенная задачка, которую я решил. НО меня мучают сомнения выбрал ли я правильный вариант решения. Так-как я очень люблю чтобы все было оптимально, то естественно мне очень интересно какой из вариантов наиболее оптимален. Итак задача и варианты решения:
Есть хмл файл содержащий данные определенной структуры. Структура каждого элемента такова:
название, некоторые параметры целочисленного типа и ветка List, которая содержит дополнительный список данных (но не у каждого элемента есть эта ветка List).
Таким образом получаем дерево такого типа:
DocumentElement
+Item
|- Param1 = 10
|- Param2 = 20
|- Param3 = List
|- Category
|- ParamA = 10
|- ParamB = 15
|- ParamC = 4
|- Category
|- ParamA = 144
|- ParamB = 156
|- ParamC = 20
+Item
|- Param1 = 56
|- Param2 = 78
+Item
|- Param1 = 10
|- Param2 = 20
|- Param3 = List
|- Category
|- ParamA = 10
|- ParamB = 15
|- ParamC = 4
|- Category
|- ParamA = 144
|- ParamB = 156
|- ParamC = 20
|- Category
|- ParamA = 194
|- ParamB = 146
|- ParamC = 24
Структура Вам понятна. Теперь представьте что каждому Item может соответствовать несколько некоторых элементов к которым надо применить Param1, ParamN этого Item и выбрать по параметрам А, В, С к какой категории принадлежат элементы. Когда мы обработали все элементы относящиеся к Item[1], мы переходим к обработке всех элементов, которые относятся к Item[2]. Так-как количество Category у каждого элемента Item разное, я решил создавать двумерный динамический массив integer и считывать категории туда, а обработав все элементы которые относятся к данному Item удалять массив. Количеству строк будет соответствовать количество Category, а столбиков всего 3 (A, B, C). Вы спросите зачем массив, ведь можно просто для каждого элемента каждый раз считывать каждую категорию, делать StrToInt(a).. StrToInt(c) и проверять принадлежность к категории? Да, но в этом и вопрос, что оптимальней: кучу раз делать StrToInt или создавать и удалять динамический массив для каждого Item и бегать по нему? Что быстрее, чтение из хмл и куча StrToInt или работа с динамическим массивом? Или может лучше сделать все со связанными таблицами баз данных? Или считать хмл файл в TreeView? Подскажите или предложите свой вариант.
Сорри а путаницу!
← →
Anatoly Podgoretsky © (2005-01-02 17:56) [1]Вообще то у тебя явная деревянная структура.
← →
Sandman25 © (2005-01-03 09:54) [2]Зачем нужен StrToInt? Можно проверять и так: CategoryA = "194"
← →
Igor_thief (2005-01-03 11:42) [3]Sandman25 © (03.01.05 09:54) [2]
Я понимаю. Но я просто не упомянул о том, что CategoryA не всегда будет integer. Я просто для простоты примера сделал CategoryA integer.
Anatoly Podgoretsky © (02.01.05 17:56) [1]
Да, то что деревянная, то деревянная. Значит Вы рекомендуете создавать невидимый экземпляр TreeView, загрузить в него инфу и использовать StrToFloat? Неужели это оптимальней и быстрее чем динамические масивы (ну то что это удобнее, то это точно!)? Хотя если создать class, который будет описывать структуру категоий и добавлять его через AddObject, то не прийдется использовать StrToFloat. Надо попробовать.
← →
Anatoly Podgoretsky © (2005-01-03 12:41) [4]Я ничего не рекомендую, поскольку не знаю точно задачи, а только отмечаю деревянность структуры, а что использовать для построения дерево - это уже вторичное.
С учетомм CategoryA не всегда будет integer отпадают базы и массивы, если конечно не использовать variant
← →
kaZaNoVa © (2005-01-03 13:15) [5]Anatoly Podgoretsky © (03.01.05 12:41) [4]
> С учетомм CategoryA не всегда будет integer отпадают
> базы и массивы
ну, почему, тип "STRING" - универсален - можно хранить имхо что угодно, главное, потом преобразовывать типы =)))
← →
Erik1 © (2005-01-03 16:09) [6]TreeView точно неоптимально использовать, надо использовать невизуальный компонент. TreeView может довольно сильно тормозить на большом количестве элементов.
Но если много данных, то связаные таблицы самое быстрое решение. Если всего 3 уровня вложености то 3 таблицы. Хотя можно и в одну запихать. Все зависит от задачи.
← →
Igor_thief (2005-01-03 17:20) [7]Erik1 © (03.01.05 16:09) [6]
Может тогда использовать virtualTreeView от сторонних разработчиков, который ну очень быстрый. Даже Борланд использовал его в соей среде разработки.
← →
Igor_thief (2005-01-06 22:20) [8]Anatoly Podgoretsky © (03.01.05 12:41) [4]
Ну по поводу отпадения баз, то это конечно Вы поспешили (хотя я Вас понимаю, скорее всего это из-за того, что я ну очень кратко описал задачу которую мне надо оптимизировать).
Ну а все таки подскажите что лучше (в плане оптимальности использования ресурсов системы и оптимальности кода) использовать. Меня в принципе интересует работа с Category, ведь именно по этой части мне прийдется бегать больше всего. Итак вот приблизительно то что я делаю (преведение типов игнорируем :)):
var a: array of array of Currency;
...
n := Зависит от обстоятельств;
SetLength(a, n, 3);
repeat
a[j, 0] := Category[i].ParamA;
a[j, 1] := Category[i].ParamВ;
a[j, 2] := Category[i].ParamС;
inc(i); inc(j);
until i = что-то;
while Надо do
begin
Цена := Читаем от кудота;
for j := 0 to n - 1 do
begin
if (Цена >= a[j, 0]) and (Цена <= a[j, 1]) then
begin
Цена := Цена + a[j, 2];
Break;
end; // if
end; // for
// если цена не попала ни в одну категорию то Цена + Цена по умолч.
next
end; // while
a := nil;
Потом то же самое для другого Item.
Ну так как лучше, так как указано выше или сразу читать из хмл преобразовывать в Curr и с равнивать не используя при этом никаких масиво? Как быстрее?
← →
Igor_thief (2005-01-07 14:21) [9]Вот так вот!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.089 c