이 기사는 주로 아래에 설명 된대로 Java 프로그래밍 어레이에서 가장 큰 하위 매트릭스와 관련된 내용을 연구합니다.
좋은 사람을 만나는 것은 당신의 삶을 바꿀 수 있습니다. 좋은 책을 만나지 않습니까?
최근에 나는 Zuo Chengyun의 " 프로그래머 코드 인터뷰 안내서의 알고리즘 및 데이터 구조 질문에 대한 최적의 솔루션 " 을 읽었을 때 많은 통찰력을 얻었습니다. 이 지역에서 취미를 가진 블로거들도 가서 보는 것이 좋습니다.
이 책에서 설명 된 스택 기반 배열의 가장 큰 매트릭스 알고리즘은 매우 고전적이지만 블로거는 능력이 제한되어 있으며 알고리즘의 본질을 철저히 이해할 수 없었습니다. 그러나이 아이디어를 바탕으로 블로거는 이러한 유형의 문제를 처리하기위한 간단한 알고리즘을 제시했으며, 이는 다음과 같이 요약됩니다.
핵심 아이디어
먼저 사진을 살펴보고 대략 이해할 수 있습니다.
그림과 같이, 각 라운드는 작업이며, 우리의 핵심은 각 라운드의 내부 작업입니다.
각 층의 최대 길이를 지속적으로 계산하고 중단되지 않습니다.
다시 말해, 우리는 바닥에서 최상위 라운드를 계산하는 가장 중요한 배열이며,이 라운드에서 얻을 수있는 연속 최대 하위 매트릭스의 면적을 계산할 수 있습니다. 그런 다음 각 라운드에 대한 가장 큰 데이터 만 비교하고 배열의 가장 큰 연속 서브 매트릭스의 영역을 찾으려면 반환하면됩니다.
암호
좋아, 위의 핵심 아이디어가 제시되면 코드를 작성할 수 있습니다. (내가 그것을 명확하게 말하지 않았다고 생각하지만 용서 해주세요).
패키지 stack_and_queue;/*** @author guo pu <br>* 배열*/public class maxrectangle {public static void main (string [] args) {integer [] {2, 1, 3, 5, 7, 6, 4}; integer maxrectangle = maxrectanglearea (arr); system.out.println ( "배열에서 가장 큰 연속 사각형 영역의 영역은" + maxrectangle);}/*** @param arr* @array*/private static interger maxRectLea (Integer [] arr)의 연속 사각형 영역의 최대 영역입니다. (int i = 1; i <= arr.length; i ++) {// 현재 라운드에서 축적 된 연속 길이의 일시적 값은 int empple = 0; //이 라운드 템플릿의 높이에서 최대 연속 길이를 기록합니다. (int j = 1; j <= arr.length; j ++) {if (arr [j -1]> = i) {templen += 1; templen_max = templen;} else {templen = 0;}} 결과 [i -1] = i * templen_max; // system.out.println ( "th" +" +" +" +"the " +"the " +"the " +"the " +" 레이어의 길이는 "+emplen_max);} // 결과 세트 배열에서 가장 큰 수치 값, 즉 연속성 영역에서 가장 큰 직사각형 도메인의 영역을 찾은 숫자를 찾았습니다. MaxArea를 반환하여 얻은 최대 연속 사각형 필드;}}코드의 의견도 비교적 포괄적이므로 너무 자세히 설명하지 않습니다.
시험
다음은 배열 테스트입니다. 먼저이 기사의 시작 부분의 그림에 표시된 배열로 테스트 해 드리겠습니다.
정수 [] arr = {2,1,3,5,7,6,4} ・・・・어레이에서 가장 큰 연속 직사각형 영역의 면적은 다음과 같습니다.
그런 다음 배열의 요소 값을 수정하여 결과가 올바른지 확인하기 위해 추가 테스트를합니다.
정수 [] arr = {2,1,3,1,7,6,4} ・・・・어레이에서 가장 큰 연속 직사각형 영역의 면적은 다음과 같습니다.
블로거 자신이 테스트 한 후 알고리즘은 정상적으로 작동합니다. :)
최적화 부분
최적화 부분에 대해 말하면, 우리가 볼 수있는 첫 번째는 마지막 단계에서 결과 세트 배열에서 최대 값을 찾는 것입니다.
실제로, 우리는 실제로 다른 변수를 적용하여 지금까지 라운드에서 가장 큰 하위 매트릭스의 영역을 기록 할 수 있습니다. 그러나이 최적화는 큰 역할을하지 않으며 시간 복잡성에서 크게 개선되지 않습니다.
또 다른 요점은, 더 나은 진입 점은 각 라운드에 대한 계산을 수행 할 때 판단을 추가하여 현재 라운드 전에 하향으로 순환할지 여부를 결정하는 것입니다. 배열의 요소가 크게 변동하는 경우 최적화 수준은 여전히 매우 좋습니다.
요약
이 작은 알고리즘은 더 절묘하며, 더 결함이있는 유일한 것은 시간 복잡성이 약간 더 강력하다는 것입니다. 독자가 시간 복잡성이 상대적으로 낮은 알고리즘을 찾고 있다면 우회를하십시오.
결과를 찾고 싶다면 꽤 좋습니다. 적어도 그것은 폭력적인 컴퓨팅 방법보다 훨씬 더 효율적입니다.
위는 Java 프로그래밍 어레이의 최대 하위 매트릭스에 대한 간단한 솔루션에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!