2012-09-11 4 views
1

나는 주어진 N * N 행렬을 가지고 있는데, 나는 더 큰 행렬에서 가능한 모든 고유의 행렬을 찾아야한다. 어떻게 그것을 빨리 그리고 기억 효율성을 달성 할 수 있습니까?N * N 행렬, 고유 한 정사각형 행렬의 개수 ... ..?

문제 직면 : 실제로 실제로 생성되는 행렬은 실제로 N -> [2,50,000,.3,00,000]입니다. 각 요소는 실제로 비트 [On/Off] 또는 [0/1]로 표시됩니다. 나는 특정 한계 (예를 들어 20> N> = 20)보다 큰 모든 고유 정사각 행렬을 가져와야하며, 정사각형 행렬의 모든 요소는 1이어야합니다. 그런 다음 행렬 만 추가 처리에 사용됩니다. , 그래서 기본적으로 그러한 행렬을 찾아야합니다.

+1

관심이 있으신 분은이 정보를 언제 사용 하시겠습니까? –

+2

컨텍스트에서 "더 큰 행렬의 정사각형 행렬"이란 무엇입니까? 1 × 1 행렬 또는 2 × 2 이상 만 포함합니까? 연속 행 또는 열 또는 임의의 하위 집합 만 선택합니까? – MvG

+0

@MvG, 예, 절대적으로, 마치 N * N의 체스 판을받은 것처럼 생각하고 가능한 모든 수의 칸을 계산해야합니다! !! 빠르고 효율적으로 뭔가를 제안하십시오. – KDjava

답변

1

알고리즘은 간단 사각형 행렬

  • 사용 루프

    1. 카운트 수가 각 행렬이 번호
    2. 계산 i_min, j_min, i_max, j_max 위에. 특정 크기의 행렬을 찾기 위해이 행렬을 반복하는 것입니다.
    3. 데이터 범위 i_min, j_min, i_max, j_max을 새 행렬에 복사하십시오.

    다만 힌트 : 행렬 큰 행렬의 크기에 의존 정사각형의 수

    • 의 1x1 ->1 * (1 × 1)
    • × 2 ->4 * (1 × 1) + * (2x2)
    • 3x3 -> * * (2 × 2) + 1 * (3 × 3)
    • × 4 ->16 * (1 × 1) + 9 * (2 × 2) + 4 * (3 × 3) + 1 * (4 × 4)

    여기에 있습니다.

    참고 : 여기에는 연속적인 행/열 조합 만 포함됩니다.

  • +0

    나중에 이것은 정확하지만 실제로는 너무 많은 시간이 걸립니다. (무차별 대입) 사실 실제로 만들어진 행렬은 N -> [2,50,000,.3,00,000]입니다. 각 요소는 실제로 비트 [On/끄기], 그리고 특정 제한 (예 : 20)보다 큰 모든 고유 정사각형 행렬을 가져와야하며 행렬의 모든 요소는 1이어야합니다. – KDjava

    +0

    @KDjava 그런 다음이 모든 질문을 편집해야합니다 세부 – mishadoff