Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите оптимальный алгоритм составления дерева, База данных, загрузка в дерево 
:(
    Опции темы
gesper
Дата 11.12.2012, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: нет
Всего: 2



Если глупый вопрос, не судите строго, программы пишу для собственных нужд, а не по работе, и 5 лет на программиста не учился.

Задача вроде простая, но алгоритм тормозной получается. Есть класс с данными, в котором хранятся записи о продукции, название производителя, серия, марка, изделие, и прочие данные по изделию. Т.е. это все идет как таблица с полями.
Циклично обходя списко его загружаю в интерфейс пользователя в древовидной форме(treeview). Программа проверяет есть ли производитель среди узлов дерева, если нет, то создает его, есть ли серия продукции в потомках узла, если нет создает его и добавляет туда все изделия. В итоге получается что то типа:

-Проект
--
--Завод ОАО Печеньки
----Печеньки круглые
----Печеньки квадратные
-------Печенька 60х40
-------Печенька 80х80 сладкая
и. т.д.

Проблема в том, что чтобы обработать записи, когда их уже за 100 это дело весьма заметно долго создается. Добавил в алгоритм запоминание узлов Производитель и Серии, чтобы заново их не искать, если идут подряд записи от одного производителя, но все равно хочется быстрее. Есть какое то оптимальное решение для таких фильтраций списков?

Или надо разбивать список на части и в потоки разные запускать?

Это сообщение отредактировал(а) gesper - 11.12.2012, 10:30
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Pavia
Дата 11.12.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Нарушены правила построения БД. 
http://ru.wikipedia.org/wiki/Нормальная_форма 

Во-вторых тормозить при 100 не должно.
Вот при 100 000 ещё поверю.

Как решение отсортировать.  Но правильно будет переделать БД.

PM MAIL   Вверх
gesper
Дата 11.12.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: нет
Всего: 2



Цитата(Pavia @  11.12.2012,  10:45 Найти цитируемый пост)
Нарушены правила построения БД. 
http://ru.wikipedia.org/wiki/Нормальная_форма 

Во-вторых тормозить при 100 не должно.
Вот при 100 000 ещё поверю.

Как решение отсортировать.  Но правильно будет переделать БД.

1) Если чесно, то что написано в Wiki, это набор умных слов без характеристики что и как выглядеть должно, а главное почему так. Примеров нет, слова на дело перевести сложно очень.

2) Посмотрел сейчас, 150 записей обрабатываются 3 секунды, визуально это долго выглядит, если убрать построение дерева, и просто все под один узел загонять, списком, то обрабатывается в миг, а как начинаешь структурировать по каталогам, то тормоза.
Отказаться от списка общего нельзя, структурировать в дереве данные тоже обязательно нужно.
Ладно, буду искать...

3)Но правильно будет переделать БД.
Это вобще по факту не БД, а Класс языка программирования (ObjectList). От использования БД отказался сразу из-за некоторых особенностей их применения.

Это сообщение отредактировал(а) gesper - 11.12.2012, 11:13
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
DarkProg
Дата 11.12.2012, 11:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Хм... как бы попроще объяснить. Есть два способа построения дерева - обходом в глубину и в ширину.
В глубину - идём по одной ветке до конца пока не дойдём, в ширину - строим по уровням(сначала 1-й, потом 2-й и т.д.). Что лучше зависит от задачи.
Алгоритмы построения дерева по сути рекурсивные, то что делаете вы будет действительно медленно работать.

Лучше всего нормально организовать систему классов, чтобы можно было как-то строить узлы без проблем, т.е. по сути классы должны отражать дерево. Тогда можно будет делать обход дерева.

P.S. У меня в дереве строится наверное 1000 узлов и где-то около того же компонентов на форме в зависимости от дерева итого 4 секунды на всё про всё уходит со всеми перестройками и алгоритмами вычисления.



--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
DarkProg
Дата 11.12.2012, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



//что за странный дубль затесался


Это сообщение отредактировал(а) DarkProg - 11.12.2012, 19:06


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Pavia
Дата 11.12.2012, 12:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Цитата(gesper @  11.12.2012,  11:06 Найти цитируемый пост)
Это вобще по факту не БД, а Класс языка программирования (ObjectList). От использования БД отказался сразу из-за некоторых особенностей их применения.

Вы отказались не от БД, а от СУБД. И начале городить свою на классах.

Цитата(gesper @  11.12.2012,  11:06 Найти цитируемый пост)
2) Посмотрел сейчас, 150 записей обрабатываются 3 секунды, визуально это долго выглядит, если убрать построение дерева, и просто все под один узел загонять, списком, то обрабатывается в миг, а как начинаешь структурировать по каталогам, то тормоза.Отказаться от списка общего нельзя, структурировать в дереве данные тоже обязательно нужно.Ладно, буду искать...

Об этом и речь. Структур надо было придумывать сразу при конструирование БД.  На данный момент вы решаете проблему структурирования. При этом вы её выполняете каждый раз при загрузке программы. А должны были сделать это один раз при вводе данных в БД.
И более того вы используете довольно не оптимальный способ структурировать. Каждый раз выполняя обход дерева при добавления новой записи. 
Но даже при этом у вас где-то косяк, так как эта операция должна выполняться раз в 100-1000 быстрее. 

Сделайте сортировку и вы за один проход по списку сможете добавить свои записи в дерево не бегая по всему дереву а добавляя их в порядке обхода. 

Цитата

1) Если чесно, то что написано в Wiki, это набор умных слов без характеристики что и как выглядеть должно, а главное почему так. Примеров нет, слова на дело перевести сложно очень.

Просто убрать дублирование данных и убрать лишние связи. Организовать упорядоченные данные для быстрого обращения к ним. 
PM MAIL   Вверх
gesper
Дата 11.12.2012, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: нет
Всего: 2



Цитата(DarkProg @  11.12.2012,  11:36 Найти цитируемый пост)
Хм... как бы попроще объяснить. Есть два способа построения дерева - обходом в глубину и в ширину.
В глубину - идём по одной ветке до конца пока не дойдём, в ширину - строим по уровням(сначала 1-й, потом 2-й и т.д.). Что лучше зависит от задачи.
Алгоритмы построения дерева по сути рекурсивные, то что делаете вы будет действительно медленно работать.

Лучше всего нормально организовать систему классов, чтобы можно было как-то строить узлы без проблем, т.е. по сути классы должны отражать дерево. Тогда можно будет делать обход дерева.

P.S. У меня в дереве строится наверное 1000 узлов и где-то около того же компонентов на форме в зависимости от дерева итого 4 секунды на всё про всё уходит со всеми перестройками и алгоритмами вычисления.

Очень понятно обьяснил smile

Цитата(Pavia @  11.12.2012,  12:38 Найти цитируемый пост)
Об этом и речь. Структур надо было придумывать сразу при конструирование БД.  На данный момент вы решаете проблему структурирования. При этом вы её выполняете каждый раз при загрузке программы. А должны были сделать это один раз при вводе данных в БД.
И более того вы используете довольно не оптимальный способ структурировать. Каждый раз выполняя обход дерева при добавления новой записи. 
Но даже при этом у вас где-то косяк, так как эта операция должна выполняться раз в 100-1000 быстрее. 

Я понял. Правда организацией структуры я как раз и занимался, поскольку имеющийся вариант был для меня оптимальным, чтобы программа выполняла расчеты с использованием данных из списка изделий и подбора изделий.  Списком быстрее, чем дерево лопатить с отдельными классами, но вот при создании менеджера управления самой БД, где то ошибся, буду искать.

Pavia, DarkProg, за теорию спасибо smile
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
DarkProg
Дата 11.12.2012, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(gesper @  11.12.2012,  13:53 Найти цитируемый пост)
Pavia, DarkProg, за теорию спасибо  

Не за что, главное чтобы в конечном итоге вышел толк.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1055 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.