Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
3-1103537492
IgorV
2004-12-20 13:11
2005.01.23
QReport, вложенная группировка


14-1104917688
asdqwer
2005-01-05 12:34
2005.01.23
Реализация длинной арифметики на Паскале и с делением!


1-1105612514
Walker
2005-01-13 13:35
2005.01.23
Quick Report for Delphi 2005


14-1104934892
Prohodil Mimo
2005-01-05 17:21
2005.01.23
Что лучше HDD Samsung или HDD WD ?


1-1105005494
Progh
2005-01-06 12:58
2005.01.23
Работа с TListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский