C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Двумерный массив динамического размера, Нужно быстро оперировать с ним
Schumi
Отправлено: 06.02.2005, 20:46


Машинист паровоза

Группа: Участник
Сообщений: 206



Представьте у меня есть большой объем информации в виде массива, где каждый элемент может принимать одно из трех значений.
Сейчас у меня этот массив сделан статически.
Хочу выделять память динамически. Но здесь возникает проблема
Представьте я объявляю char **Arr; потом выделяю память как надо:сперва строки,потом для каждой строки — столбцы. Все хорошо, но возникает необходимость удалять строки — с этим проблем нет.
А вот когда меняется число стоблцов — мне для каждой строки нужно будет снова выделять память под новый массив и для каждой строки копировать из исходного информацию побайтно. И это получится долго.
А можно целыми блоками копировать память?
К примеру есть:

CODE

char *Source=new char[100];
//потом чем-то заполняю Source информацией
// вариант 1
char *Dest=new char[200];
// ???????   нужно самым быстрым способом скопировать в первые 100
байт Dest содержимое Source, и сам Source удалить ?????????
// вариант 2
char *Dest=new char[50];
// аналогичный вариант
Георгий
Отправлено: 06.02.2005, 23:01


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



можно попробовать использовать захват памяти с запасом — например в строке 13 элементов, а памяти захвачено на 20. это даст выигрышь при частых операциях добавления/удаления одного элемента

или использовать список блоков, например, по 15 элементов тогда, если в блоке не использовано ни одного элемента он удаляется из списка. выигрышь при частых добавлениях/удалениях нескольних элементов. проигрыш в скорости доступа — надает в N/(2L) раз где N число элементов L — размер блока

или использовать 2х уровневую адресацию в списках блоков — список блоков указателей на блоки.тогда индекс элемента / размер блока = номеру элемента хранящего указатель на блок, тогда со скоростью доступа будет так: N/(S*L) где S размер блока указателей на блоки, но чуть чуть замедляются операциидобавления столбцов — в худшем случае в 2 раза в среднем на 1+1/S раз

оценить что именно использовать поможет статистика — если
узнать примерное соотношение числа операций:
чтение элементов
запись элементов
удаление строк (и по сколько строк удаляется)
удаление столбцов (и по сколько строк удаляется)
аналогично про добавление

то будет видно что лучше из предложенных конструкций
olegenty
Отправлено: 07.02.2005, 07:58


Ветеран

Группа: Модератор
Сообщений: 2412



vector< vector < char>>
Георгий
Отправлено: 07.02.2005, 12:21


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (olegenty @ 07/02/2005, 09:00)
vector< vector < char > >

Возможно я вопрос не понял, но вроде спрашивали как эффективно организовать 2х мерную таблицу, с частыми операциями вставки, удаления строк и столбцов, чтением и записью отдельных элементов.
и чтоб памяти мало занимала и работала быстро.
Schumi
Отправлено: 07.02.2005, 19:18


Машинист паровоза

Группа: Участник
Сообщений: 206



Понимаете, мне не столь важно, как оптимально я использую память,а как быстро я с ней работаю.
Отсуда такой вопрос. Какой самый быстрый способ,чтобы:
1) скопировать один массив целиком в другой;
2) заполнить целиком массив некоторым значением;
HKarel
Отправлено: 08.02.2005, 00:15


Не зарегистрирован







Сдается мне, что конструкция vector< vector < char>> будет не очень эфффективной, т.к. в какие-то моменты будут происходить значительные траты времени на перераспределение памяти, да и вставка элементов в "середину" будет приводить к проблемам. Возможно, больше подойдет вариант list< list< char>>, но у него свои недостатки: доступ к элементам можно осуществить только через итераторы, что не очень быстро. С моей стороны вот какое предложение: у меня есть темплит TList< T> — это аналог делфевого TList-a, если оставишь мыло — накидаю маленький примерчик, мне интересно посмореть как он будет работать с большими объемами.
Schumi
Отправлено: 08.02.2005, 08:05


Машинист паровоза

Группа: Участник
Сообщений: 206



Давай. Почтовый ящик: shyl@mail.ru
Konstantine
Отправлено: 08.02.2005, 09:08


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (Schumi @ 07/02/2005, 20:20)
...мне не столь важно, как оптимально я использую память,а как быстро я с ней работаю...

самые быстрые метод при этом:
1) выделение памяти в пару раз больше чем нада (чтоб меньше перераспределять)
2) для копирования данных использовать COPYMEMORY и подобные... эти макросы используют прямые инструкци процессора => быстрая работа

P.S.: но всё же интересно, что это за код такой и чего такого он сссчитает, что современнойй производительности не хватает и нужно низкоуровневая оптимизация (хотя сам бы я так и делал) biggrin.gif
HKarel
Отправлено: 08.02.2005, 10:25


Не зарегистрирован







Требуется уточнение: насколько я понял, проблема перераспределения (копирования) памяти проистекает из потребности вставлять/добавлять/удалять столбцы. Если получится решить эту проблему без перераспределения памяти — это Вас устроит ?
olegenty
Отправлено: 08.02.2005, 11:06


Ветеран

Группа: Модератор
Сообщений: 2412



да, с вектором погорячился, но основная мысль там не столько вектор, сколько попытка обратить взор вопрошавшего на STL.
HKarel
Отправлено: 08.02.2005, 17:17


Не зарегистрирован







Schumi, проверяй почту

Вернуться в Вопросы программирования в C++Builder