솔루션이 효율적인 솔루션이어야합니까?


9

나는 주로 Top Coder에서 많은 문제를 해결합니다. 나는 많은 사람들에게 답을 얻을 것이지만, 대부분 비효율적 인 솔루션으로 끝납니다.

실제 구현에서 문제에 대한 솔루션이 효율적이라는 것이 정말로 중요합니까? 그렇다면 어떻게 개선 할 수 있습니까?


4
컨테스트 관점 또는 실제 구현 관점에서 묻고 있습니까?
rjzii 2012

@RobZ : 실제 구현에서
Ant의

1
"실제 세계"는 많은 근거를 다룹니다. 임베디드? 서버 애플리케이션? 모바일 애플리케이션? 단일 사용자 개인용 컴퓨터 소프트웨어? 과학적 시뮬레이션? 답이 반드시 같은 것은 아닙니다.
David Thornley 2012

답변:


34

최선의 해결책은 (중요도를 높이기 위해) 효율적이고 유지 보수 가능 하며 수행 되는 솔루션입니다 .

^^^ 이것이이 답변에서 실제로 필요한 유일한 것입니다. ^^^

효율성이 중요 합니다. 아마도 우리의 풍부한 하드웨어 때문일 수도 있지만 성능은 특징 입니다. 경쟁에서 효율성은 분명히 중요합니다. 효율적인 코드 작성 방법을 알아야합니다. 더 중요한 것은 애플리케이션의 적시성 또는 유지 관리 성을 희생하지 않고 효율적이고 우수한 성능의 코드를 생성하는 모범 사례를 알아야합니다. 이것은 실제로 플랫폼과 언어에 대한 심도있는 경험이 많은 수확량을 반환하는 곳입니다.

더 중요한 것은 (95 %의 경우) 완성되고 유지 보수가 가능한 솔루션을 보유하고 있다는 것입니다. 완제품이 없으면 솔루션의 효율성 또는 유지 관리 가 중요하지 않습니다 . 버그를 추적하고 수정하거나 새로운 기능을 추가하는 데 엄청난 시간이 걸리더라도 솔루션의 효율성은 중요하지 않습니다. 그러나 효율성과 성능은 다른 사람의 의견에 관계없이 의심 할 여지없이 중요합니다.


3
예. 그리고 정확하고 수행 된 끔찍한 비효율적 인 프로그램은 개선 사항을 테스트 할 무언가를 제공합니다.
Mike Sherrill 'Cat Recall'2

1
이것의 가장 중요한 부분은 특히 개인적으로 효율성을 유지 관리 성보다 높이는 데이터베이스 개발의 효율성에 대한 모범 사례를 아는 것입니다. 사용자는 성능에 대해 필사적으로 관심을 갖습니다. 나는 종종 더 효율적인 코드를 유지하기가 더 어려워지는 것을 보았지만 개발자가 더 효율적인 코드를 이해하지 못했기 때문에 기술에 익숙해지면 첫 번째 선택으로 해당 기술을 사용합니다. 그들이 왜 일하는지 이해하기 때문에 그들은 관리인에게 더 쉬워집니다.
HLGEM

@ HLGEM이 답변의 일부가 일반적인 원칙 (첫 번째 줄 외에도)으로 강화하고 싶다면 효율적인 코드 작성을위한 모범 사례를 알고 있습니다. 그리고 효율적인 SQL이 중요하다는 의견을 가지고 있습니다.
Mike Cellini

8

나는 Mike Cellini에 동의 할 것입니다.

"충분히 효율적인"것이 있습니까? 예를 들어, 사용자 관점에서 0.00001 초에 완료되는 함수와 0.1 초에 완료되는 함수 사이에는 차이가 크지 않지만 하나는 다른 것보다 훨씬 효율적입니다. 10 분 안에 완료되는 기능은 사용자에게는 12 분 안에 완료되는 것과 크게 다르지 않습니다. 두 경우 모두 사용자는 커피 한 잔을 받거나 다른 작업을 수행하게됩니다.

효율성은 효율적인 알고리즘이 아닌 "효율적인 사용자"로 보았습니다.


내가 들었던 경험에 따르면 사용자가 20 % 향상을 알 수 있습니다. 둘 다 자격이있는 것 같습니다. 사용자는 실제로 0.1 초에서 .00001 초 사이의 응답 차이를 느낄 수 있다고 생각합니다.
Chris Pitman 2012

크리스, 당신은 사용자가 두 시스템의 차이점을 나란히 알 수 있다고 생각할 수도 있지만, 한 시스템이 사용자를 눈에 띄게 더 효율적으로 만들 수 있습니까? 내 관찰 (25 년 이상 이것을 해 왔음)은 두 시스템이 사용자가 주어진 시간에 동일한 양의 작업을 수행 할 수 있다는 것입니다.
Jaydee 2012

2

일반적으로 문제에 대한 가장 중요한 해결책은 실제로 존재하며 문제에 대해 존재하는 경우에 유효한 것입니다. 다른 말로하면, 비효율적 인 코드가 있거나 실제로 더 빠른 코드가 필요하다는 사실을 알 때까지 조기 최적화를 피하십시오 .

또한 응용 프로그램에 가장 적합한 솔루션이 일반적인 사례 솔루션이 아닐 수도 있습니다. 사례와 요점, 몇 년 전 교수는 우리 수업에 주어진 유형의 처음 10 숫자를 인쇄 해야하는 문제를 줬습니다 (죄송합니다, 유형에 대한 기억이 나에게 실패하지만 더 특이한 숫자 중 하나였습니다) 우리는 숫자가 주어진 유형인지 확인하기 위해 테스트를 받았습니다. 이것은 우리가 겪은 문제의 범위였으며 다음 날에 가장 효율적인 솔루션으로 신용을 얻었습니다. 다음 강의에서는 결과를 요약했습니다.

  • 일부 학생들은 간단한 루프를 사용하여 숫자가 정확하고 표시되었는지 확인하기 위해 제공된 공식을 사용했지만 느리지 만 작업을 완료했습니다 O (n ^ 3).
  • 다른 학생들은 연구를 해보고 주어진 숫자가 유효한지 확인하기 위해 더 나은 검사를하는 공식을 찾았습니다.이 프로그램은 훨씬 빠르게 실행되었습니다 .O (n ^ 2).
  • 한 학생은 느린 공식을 사용하여 값을 생성 한 다음 코드의 상수 배열로 복사하고 그 내용을 O (n)으로 표시합니다.

최종 솔루션은 교수가 가장 효율적으로 판단했습니다. 문제는 실제로 문제를 완전히 이해하고 외출하고 가장 효율적인 솔루션을 찾는 것이 아니라는 사실을 밝혀 냈습니다.

위의 요점은 효율적인 솔루션 문제를 찾을 때 일반적으로 코드를 시작하거나 작성하거나 코드를 최적화하기 전에 문제가 무엇인지 실제로 이해하도록 시간을 보내는 것이 좋습니다. 상수 배열에 일련의 참조 값을 저장할 수 있다면 멋진 알고리즘을 작성하는 것보다 성능 관점에서 수행하는 것이 좋습니다.

마찬가지로, 대부분의 응용 프로그램에서 비효율적 인 코드를 보는 경향이있는 사람들 (불필요하게 비효율적이지 않은 경우)은 개발자 자신이라는 것을 잊지 마십시오. 당신이해야 할 일을 정확하게하는 깨끗한 코드를 작성한다면, 사용자가 프로그램을 사용할 때와 언급 한 부분을 최적화 할 때 성능 문제를 느끼지 못할 확률이 높습니다. 당신.


2

즉, 대회의 구조에 따라 다르지만, 일반적으로, 예 : 성능이 고려에 따라, 대부분의 시간이다 자신의 문서 . 때때로, 나중의 링크에서와 같이 사냥을해야하지만 인용해야합니다.

깨끗하고 명확하며 효율적인 코드를 작성하십시오. 이를 위해 특별히 검토 광고 항목이 없지만 검토자는 읽고 이해하기 쉬운 코드에 더 잘 반응 할 가능성이 높습니다. 효율적인 코드를 사용하면 스트레스 및 벤치 마크 테스트에서 잠재적 인 성능 이점을 얻을 수있을뿐만 아니라 검토 자로부터 유용한 정보를 얻을 수 있습니다.

이를 개선하는 가장 좋은 방법은 이미 수행중인 효율적인 코드를 작성하는 것입니다. 작업을 완료하더라도 경쟁이 끝난 후에도 효율성을 개선하는 데 시간을 투자하면 그 결과를 얻을 수 있습니다.

알고리즘 관련 서적과 같은 이론에 투자 하여 특정 문제를 해결하는보다 효율적인 도구와 해결해야 할 문제를 식별하는보다 효율적인 메커니즘을 제공 할 수도 있습니다.

마지막으로, 컴퓨터 과학 과정은 점점 더 온라인 에서 이용 가능 하며 개선해야 할 배경을 다룰 것입니다.


알고리즘 디자인 매뉴얼의 최신 버전이 있습니다. (두 사람 사이에 11 년). 새로운 것에 문제가 있습니까? 특히 오래된 것보다 저렴하기 때문에. 그렇다면 대답에서 해결해야 할 것입니다.
월드 엔지니어

아니요, 방금 Amazon에서 찾은 첫 번째 항목을 나열했으며 두 번째 버전인지 확인하지 않았습니다.
Daniel Pittman 2012

1

솔루션의 효율성은 여러 요인에 따라 다릅니다. 가장 큰 것은 사용자가 원하는 것을 아는 것입니다. 몇 가지 예가 있습니다.

  1. 당신이 코드 블록의 유일한 사용자이고 그것이 당신에게 잘 작동한다면, 아마도 괜찮을 것입니다.
  2. 프로그램을 판매하려면 대상 플랫폼을 염두에 두어야합니다. 이 플랫폼으로 테스트하십시오. 프로그램 속도가 너무 느리면 더 효율적으로 작업해야합니다. 잘 보이면 다른 사용자에게 넘겨주고 동의하는지 확인하십시오.
  3. 아마도이 프로그램에는 다른 고려 사항이있을 수 있습니다. 예를 들어 서버 기반 프로그램을 구축하는 경우 프로그램을 최대한 효율적으로 만들기 위해 매우 열심히 노력해야 할 수도 있습니다. 또는 마이크로 프로세서에서 실행되는 경우에도 작동하는지 확인하십시오.

코드를보다 효율적으로 만드는 방법 :

  1. 첫 번째 단계는 시간이 가장 많이 걸리는 것에 대한 아이디어를 얻는 것입니다. 요령은 프로파일 링 코드라는 것을하는 것입니다. 시간이 가장 많이 걸리는 것을 찾아서 더 빨리 실행할 수있는 방법을 찾아보십시오.
  2. 아마도 주요 제한 요소는 메모리입니다. 이 경우, 많은 양의 메모리를 차지하는 것을 찾아서 어떻게 줄일 수 있는지보십시오.

최적화에는 전 분야가 있지만 위의 두 가지 팁은 적어도 시작해야합니다.


1

경쟁을 위해서는 판사가 누구인지, 그들이 무엇에 관한 것인지 이해해야합니다. 훌륭한 코더를 찾고 있다면 더 효율적인 코드를 얻을 수 있습니다.

일반적으로 현실 세계에서는 중요하지 않습니다. 소프트웨어 개발의 핵심 아이디어 중 하나는 "최적화 필요를 모르는 것을 최적화하지 마십시오", "필요한 것으로 입증 된 경우에만 최적화"입니다.

많은 실무자들은 이것이 쉽게 고칠 수없는 부풀어지고 비효율적 인 코드로 이어지고 어떤 경우에는 (대부분의 코더들이 매일 매일하는 것처럼 울부 짖는) 경우가 맞다고 주장합니다. 그러나 소프트웨어 개발 프로젝트는 많지 않지만 "성능 : 필요 이상으로 빠름, 비용 : 누가 돌보고, 배달 시간 : 몇 십 년", 실제로는 "저렴한 것을 원합니다. 어제 원합니다." 작동합니다. "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.