Имя: Пароль:
IT
 
Подсчет сумма квадрата
0 iceman2112
 
18.05.13
14:15
Есть матрица NxN. Нужно сосчитать суммы всех матриц MxM (M меньше N) внутри это исходной матрицы. Причем порядок алгоритма О(N*N).
Пока придумал только так:
1) Считаем суммы по столбикам и строкам всех элементов исходной матрицы и запоминаем это в полученный результат в матрицу S. (порядок NxN)
2)Считаем сумму первой матрицы, которая находится в (0,0) (порядок M)
3) Считаем суммы других матриц через предыдущие суммы и сумма столбиков и столбцов (порядок MxM)

Вроде все правильно, но громоздко и не прозрачно. Может быть есть идеи более изящного алгоритма?

P.S. могу подробнее описать
1 iceman2112
 
18.05.13
14:16
Исправьте тему на "Подсчет сумм квадратов"
2 Kerk
 
18.05.13
14:20
(0) Может поможет: "Рекурсивная функция".
3 NS
 
18.05.13
14:24
Ищи дерево отрезков, и дерево фенвика.
Правда сложность чуть хуже чем ты хочешь.
4 iceman2112
 
18.05.13
14:30
(3) не, надо именно N^N - условие задания.
5 iceman2112
 
18.05.13
14:31
(2) думал, но каким образом?
6 iceman2112
 
18.05.13
14:31
(3) я все равно не понял твою идею
7 NS
 
18.05.13
14:35
(6) в смысле не понял? Дерево фенвика именно для твоей задачи и придумано. Конкретно для твоего случая есть статья на хабре.
8 Kerk
 
18.05.13
14:35
9 NS
 
18.05.13
14:37
(4) самих матриц O(n^3), так что ты со сложностью что-то напутал.
10 iceman2112
 
18.05.13
14:39
(8) читаю
(9) Задание "слово в слово":
Дан квадратный массив N*N и число M. Для каждого квадрата M*M (M < N) в этом массиве вычислить сумму его элементов. Общее число действий порядка N*N
11 Kerk
 
18.05.13
14:41
(10) N*N многовато... -M надо
12 NS
 
18.05.13
14:42
13 NS
 
18.05.13
14:44
(10) а теперь прочитай что у тебя в (0) написано.
Ты разницы не видишь?
14 iceman2112
 
18.05.13
14:45
(12) ты говоришь, что N^3, но я же привел алгоритм N^2. Просто задание простое должно быть, и хочется изящный алгоритм
15 iceman2112
 
18.05.13
14:45
(13) нет
16 iceman2112
 
18.05.13
14:49
(13) а в чем ошибка скажи пожалуйста?
17 NS
 
18.05.13
14:49
(15) в (0) у тебя написано посчитать сумму элементов для всех квадратных матриц, а в (10) сумму элементов квадратных матриц при заданном М.
18 iceman2112
 
18.05.13
14:50
пардон
19 iceman2112
 
18.05.13
14:52
может кто поправить (0)?
20 NS
 
18.05.13
15:04
Для (10) дерево фенвика не нужно.
Мне сейчас не написать решение, я у зубного :)
21 iceman2112
 
18.05.13
15:06
ну ок, я подожду - не горит. лечись
22 NS
 
18.05.13
21:45
Вычислим суммы элементов матриц размера MxM верхнего ряда матрицы NxN. На это потребуется N*M операций. (чтоб посчитать сумму элементов матрицы образованной сдвигом на один элемент влево - нужно прибависть сумму одного ряда, и отнять сумму одного ряда от предыдущей матрицы)
Вычислим так-же суммы элементов матриц MxM левого ряда матрицы NxN.
А далее, так как сумма элементов матрицы с верхним левым углом в элементе S(а,b) равна
S(a-1,b)+S(a,b-1)-S(a-1,b-1)+N(a+M-1,b+M-1)+N(a-1,b-1)-N(a-1,b+M-1)-N(a+M-1,b-1), то по-очереди можем посчитать сумму элементов всех матриц размера MxM.
N(a,b) - значение элемента [a,b] в начальной матрице. S(a,b) - сумма элементов в матрице MxM с началом (левым верхним углом) в элементе [a,b]
23 iceman2112
 
18.05.13
22:02
Спасибо, я мыслил так, но что то в этом направлении не получилось. Мб еще скину потом там посложнее задачка
24 iceman2112
 
18.05.13
22:03
завтра
25 Classic
 
18.05.13
22:07
(23)
Попробуй прежде чем считать подвести нормальную матбазу.
Например в скольких матрицах присутсвует число с позиции (1,1) или число с позиции (b,b)
Это если я правильно задачу понял
26 Classic
 
18.05.13
22:08
(25)
Тогда за один обход исходя из количества матриц для данной позиции можно высчитать суммы всех матриц
27 Classic
 
18.05.13
22:11
А нафига перебирать матрицы - неясно
28 NS
 
18.05.13
22:49
(26) Можно еще раз?
Ты предлагаешь обойти все элементы начального массива, и приссумировать каждый ко всем матрицам в которых он присутствует? Поздравляю! Ты решил за O(N^2*M^2) задачу которая легко решается за O(N^2)
29 Classic
 
18.05.13
23:02
(28)
Сумма = 0;
Для Сч = 1 По N Цикл
  Для Сч = 1 По N Цикл
      Сумма = Сумма + А[Сч,Сч] * В(Сч,Сч);
  КонецЦикла;
КонецЦикла;

Где В(Сч1, Сч2) - в скольких матрицах встречается элемент А[Сч1;Сч2]

Осталось только определить функцию В - это легко
30 Classic
 
18.05.13
23:02
(29)
Там два разных счетчика, сори
31 NS
 
18.05.13
23:03
(30) тебе вообще-то не одну сумму надо посчитать.
32 NS
 
18.05.13
23:04
В ноль нужно отдельно посичтать сумму многих матриц.
33 Classic
 
18.05.13
23:05
(31)
А, значит я неправильно задачу понял
Основная теорема систематики: Новые системы плодят новые проблемы.