Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Оптимальность   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
9-1097217538
Colt1978
2004-10-08 10:38
2005.01.23
Portal в GLScene


1-1105214747
MAlexander
2005-01-08 23:05
2005.01.23
Звуковой движок


1-1104931359
Artlav
2005-01-05 16:22
2005.01.23
ppmd компонент или dll


4-1102398395
Помощник админа
2004-12-07 08:46
2005.01.23
Логин пользователя, запустившего процесс


14-1104313116
data
2004-12-29 12:38
2005.01.23
Кто какие подарки будет дарить на НГ