0 / 0 / 0
Регистрация: 13.12.2018
Сообщений: 28
1

Статические массивы

16.12.2018, 20:11. Показов 516. Ответов 0
Метки нет (Все метки)

Есть задача где используется рекурсивное создание массивов. Динамические мне использовать нельзя, а каждый раз создавать статические массивы размером в 4 раза меньше не позволяет вижуал. Как выйти из этого положения?
Код если кому нужен. В данном случае мало того что памяти много в стеке нужно выделить, так ещё и алгоритм замедляется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
    #include "pch.h"
        #include<iostream>
        #include<cstdio>
        #include<conio.h>
        #include<cstdlib>
        #include<cmath>
        #include<ctime>
        #pragma comment(linker, "/STACK:5814142100")
        using namespace std;
        const int sizs = 256;
 
        void vivod(int matrix[][256], int n);
        void Matrix_Add(int a[][256], int b[][256], int c[][256], int n, int x1, int y1, int x2, int y2); 
        void Matrix_Sub(int a[][256], int b[][256], int c[][256], int n, int x1, int y1, int x2, int y2);
        void Matrix_Multiply(int a[][256], int b[][256], int c[][256], int x1, int y1, int x2, int y2, int n);
        void strassen(int a[][256], int b[][256], int c[][256], int m, int n, int x1, int y1, int x2, int y2);
        void Naive_Multiply(int a[][256], int b[][256], int c[][256], int n);
        
        int main()
        {
            setlocale(LC_ALL, "Russian");
            int n;
            cout << "Enter the N:";
            cin >> n;
            const int m = 256;
            int A[m][m];
            int B[m][m];
            int C[m][m];
            int k[m][m];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    A[i][j] = 0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    B[i][j] = 0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    A[i][j] = rand() % 10;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    B[i][j] = rand() % 10;
            cout << "First Matrix:" << endl;
            //vivod(A, n);
            cout << "Second Matrix:" << endl;
            //vivod(B, n);
            int begin = clock();
            //for (int i =0; i < 100; i++)
            Naive_Multiply(A, B, k, n);
            int end = clock();
            cout << "Naive Multiply tacts: " << end - begin << endl;
            //vivod(k, n);
            int begin2 = clock();
            //for (int i = 0; i < 100; i++)
            strassen(A, B, C, n, n, 0, 0, 0, 0);
            int end2 = clock();
            cout << "Shtrassen tacts: " << end2 - begin2 << endl;
            //vivod(C, n);
            system("pause");
            return 0;
        }
 
        void strassen(int a[][256], int b[][256], int c[][256], int m, int n, int x1, int y1, int x2, int y2) {
            m = n / 2;
            if (m != 1)
            {
                int s1[sizs][sizs];
                int s2[sizs][sizs];
                int s3[sizs][sizs];
                int s4[sizs][sizs];
                int s5[sizs][sizs];
                int s6[sizs][sizs];
                int s7[sizs][sizs];
                int s8[sizs][sizs];
                int m1[sizs][sizs];
                int m2[sizs][sizs];
                int m3[sizs][sizs];
                int m4[sizs][sizs];
                int m5[sizs][sizs];
                int m6[sizs][sizs];
                int m7[sizs][sizs];
                int t1[sizs][sizs];
                int t2[sizs][sizs];
                int c11[sizs][sizs];
                int c12[sizs][sizs];
                int c21[sizs][sizs];
                int c22[sizs][sizs];
                Matrix_Add(a, a, s1, m, x1 + m, y1, x1 + m, y1 + m);
                Matrix_Sub(s1, a, s2, m, 0, 0, x1, y1);
                Matrix_Sub(a, a, s3, m, x1, y1, x1 + m, y1);
                Matrix_Sub(a, s2, s4, m, x1, y1 + m, 0, 0);
                Matrix_Sub(b, b, s5, m, x2, y2 + m, x2, y2);
                Matrix_Sub(b, s5, s6, m, x2 + m, y2 + m, 0, 0);
                Matrix_Sub(b, b, s7, m, x2 + m, y2 + m, x2, y2 + m);
                Matrix_Sub(s6, b, s8, m, 0, 0, x2 + m, y2);
                strassen(s2, s6, m1, m, m, 0, 0, 0, 0);
                strassen(a, b, m2, m, m, x1, y1, x2, y2);
                strassen(a, b, m3, m, m, x1, y1 + m, x2 + m, y2);
                strassen(s3, s7, m4, m, m, 0, 0, 0, 0);
                strassen(s1, s5, m5, m, m, 0, 0, 0, 0);
                strassen(s4, b, m6, m, m, 0, 0, x2 + m, y2 + m);
                strassen(a, s8, m7, m, m, x1 + m, y1 + m, 0, 0);
 
                Matrix_Add(m1, m2, t1, m, 0, 0, 0, 0);
                Matrix_Add(t1, m4, t2, m, 0, 0, 0, 0);
                Matrix_Add(m2, m3, c11, m, 0, 0, 0, 0);
                Matrix_Sub(t2, m7, c21, m, 0, 0, 0, 0);
                Matrix_Add(t1, m5, c12, m, 0, 0, 0, 0);
                Matrix_Add(c12, m6, c12, m, 0, 0, 0, 0);
                Matrix_Add(t2, m5, c22, m, 0, 0, 0, 0);
                for (int i = 0; i < n / 2; i++)
                {
                    for (int j = 0; j < n / 2; j++)
                    {
                        c[i + n - 2 * m][j + n - 2 * m] = c11[i][j];
                        c[i + n - 2 * m][j + n - m] = c12[i][j];
                        c[i + n - m][j + n - 2 * m] = c21[i][j];
                        c[i + n - m][j + n - m] = c22[i][j];
                    }
                }
            }
            else
            {
                Matrix_Multiply(a, b, c, x1, y1, x2, y2, n);
            }
        }
        void vivod(int matrix[][256], int n)
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    cout << matrix[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl;
        }
        void Matrix_Add(int a[][256], int b[][256], int c[][256], int n, int x1, int y1, int x2, int y2)
        {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    c[i][j] = a[i + x1][j + y1] + b[i + x2][j + y2];
                }
            }
        }
 
        void Matrix_Sub(int a[][256], int b[][256], int c[][256], int n, int x1, int y1, int x2, int y2)
        {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    c[i][j] = a[i + x1][j + y1] - b[i + x2][j + y2];
                }
            }
        }
        void Matrix_Multiply(int a[][256], int b[][256], int c[][256], int x1, int y1, int x2, int y2, int n)
        {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    c[i][j] = 0;
                    for (int t = 0; t < n; t++) {
                        c[i][j] = c[i][j] + a[x1 + i][y1 + t] * b[x2 + t][y2 + j];
                    }
                }
            }
        }
        void Naive_Multiply(int a[][256], int b[][256], int c[][256], int n)
        {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    c[i][j] = 0;
                    for (int t = 0; t < n; t++) {
                        c[i][j] = c[i][j] + a[i][t] * b[t][j];
                    }
                }
            }
        }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2018, 20:11
Ответы с готовыми решениями:

Статические массивы
int a; cout &lt;&lt; sizeof(a) &lt;&lt; endl; cout &lt;&lt; a &lt;&lt; endl; Добрый день. Почему выводится, что...

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

статические массивы
Дана ценлочисленная прямоугольная матрица. Определитть номер первого из столбцов, содержащих хотя...

Массивы(статические)
Найти максимальную по длине монотонную (т. е. либо неубывающую, либо невозрастающую)...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2018, 20:11
Помогаю со студенческими работами здесь

статические массивы
Помогите, пожалуйста) Нужно выполнить следующее задание с использованием статических массивов: ...

Одномерные статические массивы
Ввести одномерный статический массив из к чисел. И сдвинуть элементы массива циклически на n...

Динамические и статические массивы
Главное отличие динамических массивов от статических состоит в том, что они могут иметь...

Статические и динамические массивы
Здравствуйте. Является ли массив статическим, когда количество ячеек (размеры) задано константой, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru