массив массивов или вложенный массив

Автор calc4fem, 22 декабря 2014, 02:53

0 Пользователи и 1 гость просматривают эту тему.

calc4fem

здравствуйте,
существует несколько таблиц с данными, которые считываются макросом в массивы.
предположим, для примера, есть школы и в них в среднем 15-20 групп учащихся. В каждой группе примерно 20-30 учеников (может варьировать).
каждому ученику могут быть сопоставлены отметки по всем из 20 изучаемых предметов. И так далее - такая примерно сложная иерархия.
Вопрос состоит в том, как организовать все в одном массиве, чтобы потом было сравнительно легко оперировать данными.
Как такой массив декларировать, как присваивать значение и потом его возвращать при надобности?
просто с массивами все мне понятно, в том числе с динамическими. А вот как и можно ли сделать чтобы элементом массива являлся другой массив - тут я затруднясь. Если есть массив aaa определенной размерности и в нем элементом aaa(2,3) является массив bbb размером 100x100
то как записать присвоение и вывод элемента bbb(10,10) в общем виде.

DixiX57

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

calc4fem

В принципе со структурой массивов я уже решил вопрос (просто воспользовавшись опцией N мерных массивов)
мне базы данных в данном случае не нужны, а вопрос был примерно такой "как оперировать массивами массивов"
и где об этом можно почитать.

Hasim

Если я правильно понял вопрос, то оперировать массивами от массивов можно так
Sub arr_arr
Dim p1(3,3)
p1(0,0)=100
p1(1,0)=110
p1(2,0)=120

p1(0,1)=101
p1(1,1)=111
p1(2,1)=121

p1(0,2)=102
p1(1,2)=112
p1(2,2)=122

Dim p2(3,3)
p2(0,0)=200
p2(1,0)=210
p2(2,0)=220

p2(0,1)=201
p2(1,1)=211
p2(2,1)=221

p2(0,2)=202
p2(1,2)=212
p2(2,2)=222


Dim p3(3,3)
p3(0,0)=300
p3(1,0)=310
p3(2,0)=320

p3(0,1)=301
p3(1,1)=311
p3(2,1)=321

p3(0,2)=302
p3(1,2)=312
p3(2,2)=322

Dim a(3,3)      ' массив массивов
a(0,0)=p1
a(1,0)=p2
a(2,0)=p3
' не закончил массив массивов, т.к долго продолжать

MsgBox a(2,0)(2,2)          ' элемент массива в массиве

a(1,0)(1,2)=1012

MsgBox a(2,0)(2,2)

MsgBox p3(2,2)

End Sub

calc4fem

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

calc4fem

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

If forces(i,1)=ii And forces(i,2)=j And forces(i,3)=k Then
присвоение
End If

Так вот она забирает массу времени на выполнение. Следующий аналогичный цикл без "And" выполняется за секунду.
Как уйти можно от этого?
Читаю http://myooo.ru/content/view/116/95/ и не могу понять. Похоже If требует много времени на обработку сам по себе
Думаю что если программисты в чате есть - могут посоветовать что то. Потому что ждать минуту или две каждый раз как то стремно.

bormant

Вы б лучше фрагменты вместе с источником задержки (циклами) показывали.
Автору на яд. Поддержать форум.

calc4fem

циклы типа
For i=1 To ...
For ii=1 To ...
 For j=1 To ...
  For k=1 To ...

If .. Then
Присвоение значение элементам массива
End If

Next...
Next...
....

Ровно такой же цикл но без If - отрабатывается менее чем за секунду. С If-ом зависает минуты на полторы.
Но тут по смыслу сложно уйти от If, так что ничего не поделаешь. Вернее - можно, но надо писать более длинный код.

JohnSUN

Ну, похоже, самая простая оптимизация этой конструкции - преобразование алгоритма "в лоб".
Суть сводится к изменению конструкции If...Then присвоение на конструкцию If...Then внутренний цикл. Просто сложное условие внутри If разваливается на три отдельных If'а и каждый из них выносится за пределы цикла, где эти переменные не меняются.
Что-то вроде
For i=1 To ...
For ii=1 To ...
  If forces(i,1)=ii Then
   For j=1 To ...
    If forces(i,2)=j Then
     For k=1 To ...
      If forces(i,3)=k Then
       Присвоение значение элементам массива
      EndIf ' =k
     Next k
    EndIf ' =j
   Next j
  EndIf ' =ii
Next ii
Next i
Это позволит пропустить (вообще не выполнять) циклы для индексов, которые не соответствуют условиям.
Следующий шаг оптимизации - перераспределение циклов по количеству итераций так, чтобы самые длинные циклы оказались глубже всего. Тогда за счет кучи последовательных проверок на верхних уровнях можно избавить машину от необходимости крутить большие ненужные циклы.
И дальше - следующие шаги, которые потребуют знания архитектуры машины и хорошей фантазии, чтобы почувствовать себя этой самой машиной.

Жаль, что ограничился строчкой "Присвоение значение элементам массива"... Вполне может быть, что там что-то вроде

a(ii, k, j) = 1
b(ii, k, j) = 1 - a(ii, k, j)
В таком случае легко отказаться и от трех внутренних циклов, и от If'ов

For i=1 To ...
a(forces(i,1), forces(i,2), forces(i,3)) = 1
b(forces(i,1), forces(i,2), forces(i,3)) = 1 - a(forces(i,1), forces(i,2), forces(i,3))
Next i
Выглядит громоздко, но делает то же самое....
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Вместо абстрактного теоретизирования, может быть, проверите все ваши гипотетические построения на конкретных примерах?
С секундомером в руке.

JohnSUN

Экий ты грубый - с секундомером... Третий линолеум на дворе! Компьютер и сам может замерить быстродействие любого алгоритма. А в некоторых инструментах - "профайлер" называется - даже отобразить расходы ресурсов на отдельные строки кода.
Насчет абстрактного теоретизирования - это не ко мне, это к Кнуту
И не "выкай"....
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Под "вы" я имел в виду не только тебя, JohnSUN, а всех, начиная с ТС, кто озаботился этой проблемой.
Я уж сто раз писал: выкладывайте конкретные примеры, чтобы не сидеть и думать: а что там у него такого понаписано, что ни хрена не работает?

RAN

#12
JohnSUN, тогда уж так
 For i = 1 To ...
       For ii = 1 To ...
           If forces(i, 1) = ii Then
               For j = 1 To ...
                   If forces(i, 2) = j Then
                       For k = 1 To ...
                           If forces(i, 3) = k Then
'                                Присвоение значение элементам массива
                               Exit For
                           End If    ' =k
                       Next k
                     End If    ' =j
               Next j
           End If    ' =ii
       Next ii
   Next i

dndn

Hasim
JohnSUN

Добрый вечер! А вы не могли бы помочь с ответом на этот вопрос:

http://forumooo.ru/index.php/topic,4272.msg28829.html#msg28829

Мне кажется почему-то кажется, вы его знаете.  :)