![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Методы хранения сильно разреженных матриц
Xandr001 © (2008-09-08 09:19:00)В общем такая ситуация. Есть массив
var
Kad_number: Array[1..99, 0..99, 0..99, 1..99, 1..9999] of Integer;
Он очень разрежен (ок 200 000 записей), но сохранить размерность необходимо. Загружается динамически при открытии файла - справочника. Всё это жрёт больше 2х гигов памяти. Не компилирутся даже...
вот вопрос: есть ли какие-то способы хранения этого добра не выделяя память под весь массив, а только под заполненные ячейки?
Нашёл в сети 1 способ, там создаются отдельные массивы/строки для каждого из измерений массива, в которых записываются индексы ненулевых элементов, и 1 массив/строка в кот. хранятся сами значения ненулевых элементов.
Этот способ мне не подходит, потому что мне необходим прямой доступ к каждому элементу. То есть при поступлении на вход строки типа: "05:01 03 45:0567" мне нужно сразу узнать значение элемента Kad_number[5,1,3,45,567].
(2009-04-01 12:04:00) [1]Удалено модератором
(2009-04-01 12:04:00) [2]Удалено модератором
KilkennyCat (2008-09-12 14:49:00) [3]а при чем здесь входная строка?
как будет она обрабатываться, дело десятое.
Xandr001 (2008-09-12 14:14:00) [4]
> про размер данных
Всё так, но только в идеальных условиях. дело в том, что входная строка может иметь различные виды:
"05:01 03 45:0567", " 05 :01 03 45:0567", "05:0103 45:0567", "05:0103 45:0 5 6 7"," 05:010345: 0567", "05:01:03:45:0567", " 05 :0 1 0 3 4 5:0567 ", " 05 :000 1 0 3 4 5:0567 "...
Jeer (2008-09-12 11:55:00) [5]Покурите:
http://www.robosoft.info/knowledge/articles/detail.php?ID=886
KilkennyCat (2008-09-12 11:20:00) [6]про размер данных.
Xandr001 (2008-09-12 11:05:00) [7]
> столь фиксированных параметрах
Это Вы про какие такие параметры????????????
KilkennyCat (2008-09-12 08:47:00) [8]а зачем его загружать-то?
массив вещь жесткая, че его не читать с файла-то? позиция нужного элемента моментально определяется при столь фиксированных параметрах.
Xandr001 (2008-09-12 06:08:00) [9]давай.
1) непрерывный линейный массив arr[0..14]: 1,2,5,9,8,3,5,7,88,6,3,6,8,2,8
2) разреженный линейный массив arr[0..14]: 0,0,5,0,0,0,0,7,0,0,3,0,0,0,8
3) линейный массив arr[0..14] заполняется блоками: 2,5,5,4,7,0,0,0,0,0,3,6,7,9,8
Длинна блоков и пустых элементов между ними не известна заранее, но постоянна после загрузки массива, т.е. в процессе выполнения программы массив статичен.
evvcom (2008-09-10 15:48:00) [10]какими блоками? Блоками по 4 байта? :)
Вот у тебя элемент [5,1,3,45,567]. Какими блоками мы чего заполняем? Давай на пальцах
Xandr001 (2008-09-09 15:37:00) [11]
> Всё это имеет смысл, когда массив непрерывный
Массив заполняется блоками.
evvcom (2008-09-09 11:58:00) [12]В моем понимании "прямой доступ к элементу массива" это, когда я получаю указатель на этот элемент, и за этим элементом лежит следующий, если он имеется. В этом случае я не теряю время на определение координат этого следующего элемента. Всё это имеет смысл, когда массив непрерывный. В случае же "разреженного", может быть даже упакованного по сути массива (ассоциативного) иметь такой прямой доступ не вижу смысла.
brother (2008-09-09 10:31:00) [13]> у меня скил "искусство задавать правильные вопросы" не прокачан...
у нас скилл телепатора тож)
Xandr001 (2008-09-09 10:20:00) [14]
> Я хочу убедиться знает ли автор, что такое прямой доступ.
да. я знаю.
> вопрос стоял бы так: ...
у меня скил "искусство задавать правильные вопросы" не прокачан...
int64 (2008-09-08 17:14:00) [15]Anatoly Podgoretsky © (08.09.08 16:41) [27]
Я знаю, что такое массив и что такое ассоциативный массив. Спасибо.
Я хочу убедиться знает ли автор, что такое прямой доступ.
У меня есть подозрение, что ему нужна лишь синтаксическая конструкция вида: Kad_number[5,1,3,45,567]. Т.к., в противном случае, вопрос стоял бы так:
"У меня есть тип данных, превышающий 2Гб, но я связан по рукам использовать другой тип данных, и использовать другой доступ кроме прямого итд"
Anatoly Podgoretsky (2008-09-08 16:41:00) [16]> int64 (08.09.2008 16:30:26) [26]
> И что я должен понять?
> След. код, в твоем понимании, прямой или кривой доступ?
Понять ты должен, что это доступ к ассоциативному массива, который никогда не бывает прямым, если только ассоциативные массивы не реализованы в самом языке.
int64 (2008-09-08 16:30:00) [17]Xandr001 (08.09.08 15:50) [25]
> > "прямой доступ к каждому элементу":
>
> i:=Kad_number[5,1,3,45,567];
И что я должен понять?
След. код, в твоем понимании, прямой или кривой доступ?
TDefault = class
private
function GetKad_number(Index1, Index2, Index3, Index4, Index5: Integer):
Integer;
procedure SetKad_number(Index1, Index2, Index3, Index4, Index5: Integer; const
Value: Integer);
public
property Kad_number[Index1, Index2, Index3, Index4, Index5: Integer]: Integer
read GetKad_number write SetKad_number;
end;
implementation
function TDefault.GetKad_number(Index1, Index2, Index3, Index4, Index5:
Integer): Integer;
begin
Result := // не "прямой доступ к каждому элементу"
end;
procedure TDefault.SetKad_number(Index1, Index2, Index3, Index4, Index5:
Integer; const Value: Integer);
begin
// и здесь не "прямой доступ к каждому элементу"
end;
Xandr001 (2008-09-08 15:50:00) [18]"05:01 03 45:0567" - входящее значение.
> "прямой доступ к каждому элементу":
i:=Kad_number[5,1,3,45,567];
int64 (2008-09-08 15:16:00) [19]И опять же все зависит от разряженности. Может достаточно будет хранить тем 1 способом, что ты нашел в сети: "координаты: значение"
Anatoly Podgoretsky (2008-09-08 15:15:00) [20]> Xandr001 (08.09.2008 14:57:20) [20]
Хеш элемент хеш таблицы - одна строка