인터뷰 질문 순위 FizzBuzz (1), malloc (10) 구현 [닫기]


10

다음 인터뷰 질문의 난이도에 대한 귀하의 의견을 듣고 싶습니다.

O (n) 시간의 정수 배열에서 최대 합계를 가진 연속 된 하위 배열을 찾습니다.

이 사소한 들리는 문제는 Jon Bentley가 프로그래밍 진주에서 알고리즘 설계 기법을 시연하는 데 사용하는 것으로 유명해졌습니다.

1-10의 규모에서 1은 FizzBuzz (또는 HoppityHop ) 테스트이고 10은 C stdlib 함수 malloc ()을 구현하는 경우 위의 문제를 어떻게 평가합니까?

나는이 질문에 가장 잘 대답 할 수있는 사람들은 Programming Pearls을 읽고이 문제를 스스로 해결하려고 시도한 사람들이라고 생각합니다. 그렇지 않은 사람들에게 동기를 부여하기 위해 'Programming Pearls'는 'Top 10 programming books'목록에 여러 번 등장합니다.

몇 가지 의견은 더 나은 평가를 얻는 데 도움이 될 수 있습니다.

  • malloc () 구현은 그다지 강력하지 않습니다. 예를 들어 K & R의 C 프로그래밍 언어를 참조하십시오. 때때로 Microsoft에 요청을받습니다 .

  • 문제 해결에 대한 CLRS 관찰 : 특히 시간 제약 조건에서 작업 할 때 명확하게 제시된 솔루션을 확인하는 것보다 처음부터 문제를 해결하는 것이 더 어렵습니다 .


12
정수가 음수가 될 수 있다는 점에서 어려움이 있습니까? (그렇지 않으면 전체 배열은 항상 가장 큰 하위 배열이므로 O (1) :-P)
Macke

4
문제는 " 연속 하위 배열 찾기 ..."
v64

6
나는 인터뷰에서 "in O (n)"을 요구 사항으로 삼지 않을 것입니다. 순진한 솔루션으로 시작한 다음 원하는 경우 다듬을 수 있지만, 누군가가이 알고리즘에 대한 사전 노출없이 1 시간의 인터뷰에서 O (n) 솔루션을 도출 할 수있을 것으로 기대하지는 않습니다.
Dean Harding

2
권리. O (n²) 솔루션을 허용하는 경우 쉬운 문제입니다.
dan04

@Dean, 나는 실행중인 aveerage 유형 합계를 위치 j에서 j + 1로 O (1)로 이동할 수 있기를 바랍니다. 아마 공평 할 수도 있고, 힌트로 제공 될 수도 있습니다. (필자는 부분 배열의 길이가 미리 지정된 된 가정입니다)
오메가 센타 우리

답변:


17

그것은 실제로 개발자에 달려 있습니다.

malloc이 10이면이 문제점을 20으로 평가합니다. 그러나 다시 malloc을 수행 한 후 다시 시도 할 수 있습니다.

이 문제를 해결했거나 머리 꼭대기의 적절한 알고리즘을 알고있는 사람은 5와 malloc ()을 10으로 만듭니다.

이 유형의 질문에 대한 문제는 쉽게하기 전에 수행 한 경우 실제로이 알고리즘을 본 적이 있는지 여부를 테스트하는 것입니다. 따라서 나는 인터뷰를 좋아하지 않습니다.

이제 개발자에게 며칠을 제공하는 테스트의 경우 알고리즘을 모르는 경우 연구를 수행하고 속도를 높일 수있는 기회를 제공하며 테스트뿐만 아니라 완벽하게 좋은 테스트입니다. 당신의 지식이지만 새로운 지식을 얻는 능력.


날씨-> 네 번째 단락에 있는지 여부 (소음으로 죄송합니다. 오타를 편집 할 담당자가 없습니다 ...)
Matthieu M.

마틴, 나는 당신이 사람들을 인터뷰하는 응용 프로그램의 유형에 달려 있다고 생각합니다. 시스템 유형의 경우 malloc은 매우 간단합니다. 나를 위해-나는 malloc으로 [스택 주소와 길이 등이 의도적으로 숨겨져 있다고 가정]하지만 하위 배열 문제는 거의 사소합니다. 열쇠는 질문을 직업의 요구와 일치시키는 것입니다.
Omega Centauri

8

나는 적어도 등급은 2 차원이어야한다고 생각한다. FizzBuzz- malloc는 한 축의 범위를 설명합니다. "기술적 복잡성"이라고 부릅니다. 그러나이 단일 차원으로는 문제를 설명하기에 충분하지 않습니다. 문제를 해결하려면 개발자는 code 이상을 생각 해야 하지만 구현 malloc하려면 복잡한 알고리즘을 만드는 것보다 더 많은 코딩 규칙이 필요합니다.

다음은 이러한 문제를 해결하는 방법입니다.

여기에 이미지 설명을 입력하십시오

요점을 설명하기 위해 병렬 병합 정렬 을 플롯에 추가했습니다 . 기술적으로나 알고리즘 적으로 복잡한 작업의 좋은 예라고 생각합니다.


2

FizzBuzz 나 HoppityHop보다 상당히 어렵다고 생각합니다.이 두 개는 단순한 if-else 또는 switch-case 인 경우에 불과합니다.

최대 하위 배열은 기본 문제에 대한 심층 분석이 필요합니다. 초보자 프로그래밍 클래스에서는 FizzBuzz 유형의 문제보다 더 높은 수학적 기술이 필요하기 때문에 기대하지 않습니다. 이 문제는 Dijkstra의 알고리즘으로 해결되는 최단 경로 문제와 비슷한 느낌을 가지고 있습니다. 아마도 가장 긴 경로 문제 의 전문 화일 것입니다 입니다.

귀하의 1에서 10 사이의 규모로 아마 3에서 5 사이로 평가 할 것입니다.

* 서버가 다운되는 동안 최대 서브 어레이 문제 는 Wikipedia에 자체 페이지가 있음을 발견했습니다 .


다음 개념적으로 훨씬 더 간단한 알고리즘이 저에게 효과적 일 때 누군가 위키 백과에 설명 된 알고리즘이 필요한 이유를 설명 할 수 있습니까? 단일 패스에서 누적 합계를 계산하여 일반적인 방식으로 최소값과 최대 값을 찾으십시오. 최대 누적 연속 하위 시퀀스는 최소 누적 합계 이후에 시작하여 최대 누적 합계까지 포함됩니다.
벤 Voigt

2
@Ben Voigt : {+2, -4, +1} 또는 {+1, +1, -1, -1, -1, -1, +1} 시퀀스를 시도하십시오. 실제로 Kadane 방법은 매우 간단합니다. 배열을 한 번만 스캔하고 3 가지 변수를 동적 프로그래밍 스타일로 업데이트합니다.
rwong

@ rwong : 아 좋아, Kadane은 최소값이 최대 값 이후에 필요한 경우에 필요합니다. 그리고 3이 아닌 5 개의 변수와 루프 인덱스를 계산합니다.
벤 Voigt

@Ben : 맞습니다. 5 개의 변수에 루프 인덱스가 있습니다.
rwong

1

제가 인터뷰 한 대부분의 프로그래머를 넘어서지 만 제가 추천 한 사람들에게는 쉬운 문제입니다.

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