프로그래머가 메모리에서 QuickSort / MergeSort 알고리즘을 구현하는 방법을 아는 것이 얼마나 중요합니까? [닫은]


58

내 노트를 검토하고 다른 정렬 알고리즘 구현을 우연히 발견했습니다.

QuickSort 및 MergeSort의 구현을 이해하려고 시도하면서 생계를 위해 프로그래밍을하고 자신이하는 일에 대해 괜찮다고 생각하더라도 사진 메모리도없고 알고리즘을 구현할 수있는 명확한 두뇌 능력이 없습니다. 내 노트에 의존합니다. 내가 기억 한 것은 그 알고리즘 중 일부는 안정적이며 일부는 안정적이지 않다는 것입니다. 일부는 완료하는 데 O (nlog (n)) 또는 O (n ^ 2) 시간이 걸립니다. 일부는 다른 것보다 더 많은 메모리를 사용합니다 ...

내 입장에서 표준 API에있는 것 이외의 정렬 알고리즘을 사용할 필요가 없기 때문에 이런 종류의 직업을 가질 자격이없는 것 같습니다. 내 말은, 얼마나 많은 사람들이 실제로 이런 종류의 것들을 스스로 기억하거나 생각 해낼 수있는 프로그래밍 위치를 가지고 있습니까?


13
솔루션이 존재하고 언제 사용하는지 기억해야합니다. 그런 다음 문서로 이동하여 구현하십시오. quicksort 또는 mergesort에 대해 알지 못했다면 여전히 bubblesort를 사용하고 있으며 데이터가 증가 할 때 프로그램이 크롤링하여 하위 솔루션을 찾는 것을 지켜 볼 것입니다.
Pieter B

1
아래에 언급 된 좋은 답변 외에도 많은 회사가 (1) 이러한 알고리즘의 복잡성을 알고, (2) 칠판에 알고리즘을 구현하는 데 유창해야합니다.
sakisk

3
Google이 오프라인 상태 인 경우가 자주 발생하므로 이러한 알고리즘을 기억하는 것이 중요합니다. : o
Lee James

성능, 사용 사례 등을 알아야합니다. 마음으로 구현하는 방법을 아는 것은 기술 회사가 인터뷰에서 요구하는 것입니다.
sakisk

@PieterB, 동의하지 않습니다. Google의 '최고의 정렬 알고리즘'에 대한 'mergesort'및 'quicksort'에 대해 알 필요가 없습니다
hyankov

답변:


117

앨버트에게 물어보고 주제에 관해 그가 무엇을 말해야하는지 보자.

"모든 것을 알 필요는 없습니다. 필요할 때 어디서 찾을 수 있는지 알아야합니다."

- 알버트 아인슈타인 의역,

아멘, 앨버트 형제, 아멘

특정 분야 (정렬, 검색 등)에서 필수 알고리즘을 제대로 조사한 후에는 실제로 알고리즘이 필요할 때까지 구현 세부 정보를 잊어 버릴 수 있습니다. 기존의 lib. 25 년 전 저는 B * -tree를 사용하여 주요 검색 시스템을 구축했지만 오늘날이를 잘 사용하려면 RTFM이 필요합니다.



9
그 질문에 어떻게 대답합니까? 그는“나는 모든 것을 알 필요는 없다 ”고 말 했지만 “나는 아무것도 몰라요”라고 말하지 않았습니다. 일부 기술은 기본적이며 전체 정보는 특정 정보가 기본 기술 범주에 속하는지 여부에 관한 것입니다.
Konrad Rudolph

1
퀵 정렬을 암기하는 것이 목표라고 생각하는 것은 질문의 요점을 놓치는 것입니다. 물론 실제 환경에서는 일반적인 퀵 정렬이 필요한 경우 라이브러리 루틴을 사용하거나 코드를 찾아서 복사해야합니다. 테스트는 재귀, 루프 불변 등을 이해하는지 확인하는 것입니다. 정렬 알고리즘을 신속하게 적어 놓는 것은 그 지식에 대한 간단한 설명 일뿐입니다. 현장에서 20 라인 퀵 정렬을 다시 도출 할 수 없다면, 실제로 알지 못하고 실제로 비효율적이거나 부정확하게하고있는 일이 얼마나됩니까?
래리 그 리츠

3
@Larry : 많은 프로그래머가 알고리즘의 세부 사항에 대해 알고있는 것을 잊어 버린 것 같습니다. 처음부터 빠른 정렬은 그중 하나입니다. 매우 좋은 이유로 높은 수준의 내용을 읽고 높은 수준의 언어를 사용하도록 선택했습니다 낮은 수준의 구현 세부 정보를 유지하는 것보다 솔직히-내가 사용하고있는 라이브러리 루틴의 종류를 신경 쓰지 않습니다. 내가 걱정하는 한 픽시 먼지와 요정을 사용할 수 있습니다. Docs는 크기 조정을 위해 O ()에 알릴 것입니다.
mattnz

2
@mattnz : "O () 사이징"에 대해 다소 뒤늦은 후속 조치입니다. 내가 어려운 방법을 배운 한 가지는 데이터 집합 을 사용하면 잘못된 참조 지역이 O ()를 완전히 압도 할 수 있다는 것입니다. 당신은 algo 인 것일 수도 O(n log n)있지만, 많은 캐시 미스가 발생하거나 (하나님은 금지) 디스크에 부딪쳤다면 그것은 n log n좋아하는 메모리 일뿐입니다.
피터 로웰

49
  1. 실제로 암기 문제가 아닙니다. 나누기와 정복과 같은 일반적인 알고리즘 클래스를 깊이 이해하는 것이 중요합니다. 나누기와 정복을 실제로 이해한다면, 퀵 정렬을 암기 할 필요가 없습니다. 필요에 따라 그 자리에서 다시 파생시킬 수 있습니다. 또한, 실제 지불 방식은 자체적으로 퀵 정렬을 다시 도출 할 수 없기 때문에 새로운 문제가 분할 및 정복 솔루션에 적합한 시기를 인식 할 수 있습니다 .

  2. 모든 프로그래밍 작업이 동일한 것은 아닙니다. 일부 작업에는 알고리즘에 대한 심도있는 지식이 필요하고 일부는 유형 이론을 이해하는 사람이 필요하며 일부는 웹 양식에서 데이터를 긁어 데이터베이스로 옮길 수있는 사람이 필요합니다. 어떤 직업에는 한 번에 모든 기술이 필요합니다. 어떤 직업을 원하십니까?


5
QuickSort를 기억하지 않고 QuickSort를 이해하는 것이 가능하지 않다고 생각합니다. 복잡하고 신비로운 것이 아니라 단지 두 가지 일반적인 아이디어가 결합 된 것입니다. 같은 일이 병합-종류를 적용하지만, 거기 당신은 단지 하나의 생각이 : P를
drxzcl

나는 2 포인트에 동의하지 않습니다. 모든 직업은 동일하며 면접관 만 변경됩니다. 이것은 정렬을 매우 잘 알고 있으며 모든 훌륭한 프로그래머는 정렬을 알아야한다고 생각합니다. 그것이 그가 알고 관심을 갖는 전부이기 때문입니다.
IAdapter

2
@IAdapter, 당신은 농담입니다! 필자는 수축 랩 소프트웨어 회사의 TROFF 매크로를 처음 작성하는 데 필요한 지식과 기술이 전산 생물학 실험실에서 현재 업무에 필요한 것과는 매우 다르다는 것을 본인의 경험으로 알고 있습니다.
Charles E. Grant

@CharlesE. Interviwer는 대부분 업무 수행에 필요한 기술이 있는지 확인하지 않습니다 (필자는 마지막 javascript / css 질문을 기억할 수 없으며 webapps를 수행합니다).
IAdapter 8

10

모든 것을 기억해야 할 유일한 시점은 현장에서 답을 구해야하고 외부 자원이 없을 때 일자리를 신청할 때 뿐이라고 생각합니다.

동료들에게 퀵소트 및 기타를 다시 작성하도록했지만 언어에 내장 된 정렬 기능을 다시 사용하라고 계속 말합니다. 우리가 작업하는 프로젝트 유형에 따라 표준 알고리즘에 일반적으로 포함되지 않기 때문에 다른 알고리즘을 기억해야하지만 정렬은 일반적으로 언어에 내장되어 있기 때문에 발생하지 않습니다.

그래도 이러한 알고리즘을 기억해야 할 때 일반적으로 Google 또는 책으로 전환하고 일반적으로 특정 구현을 찾고 있지 않지만 문제에 가장 적합한 구현은 무엇입니까?


6

그냥 어떤 기억 알고리즘 것, 어떤 시나리오에 유용 충분를 작업하는 동안 도움이됩니다. 실제로 대부분의 프로그래밍 작업 은 접근 방법을 암기 할 필요가 없으며 문제에 직면했을 때 알고리즘 패턴인식하는 방법에 관심이 있습니다 .

사실, 대부분의 프로그래밍 블로그 / 기사에는 알고리즘 주제에 관한 많은 정보가 있습니다. 따라서 정확한 구현을 암기하는 것이 중요하지 않습니다. 가장 유용한 정보는 어떤 유형의 알고리즘이 사용 가능한지, 그리고 어떤 특정 문제가 해결에 좋은지에 대한 기본 아이디어를 얻는 것 입니다. 원하는 것을 알고 나면 정확한 구현을 찾는 것이 매우 빠릅니다.

요약 하면 소스 를 찾는 데 도움 이 될 참조 및 위치를 파악하는 것이 좋습니다 .


5

정확한 구현은 그리 중요하지 않습니다. 그러나 mergesort / quicksort의 기본 원리는 재귀, 파티셔닝 등 매우 기본이며 모든 프로그래머가 이해해야합니다. 이 알고리즘은 실제로 일단 이해하면 매우 간단합니다.

그것은 당신이 그것을 찾을 수 있는지 또는 구글 할 수 있는지의 문제가 아닙니다. 프로그래머가 이러한 문제 해결 기술을 이해하고 다른 상황에 적용 할 수 있는지 여부입니다.


3

저는이 주제에 대해 두 가지 생각을합니다. 정렬 알고리즘이 무엇인지 모르지만 자신의 일을 상당히 잘하는 많은 프로그래머를 알고 있습니다. 또한 도메인을 진정으로 이해하기 위해 원칙을 이해한다고 믿습니다.

내가 오랫동안 프로그래밍 해왔 기 때문에이 주제에 대해 편견없는 대답을하기가 어렵습니다. 현재 알고있는 더 많은 알고리즘을 잊어 버렸을 것입니다. 그러나 여전히이 질문에 언급 된 정렬 알고리즘을 알고 있습니다. Agile의 사고 리더 (예 : Ron Jeffries, Alistair Cockburn)는이 아이디어에 가까운 좋은 아이디어를 가지고 있다고 생각합니다 (예 : Shu-Ha-Ri).

이 답은 요약하자면 : API를 확실히 사용하십시오 (NIH는 개발자 미성숙의 표시입니다). 그러나 항상 기본 원칙을 이해하십시오. 이게 도움이 되길 바란다.


2

정렬과 검색은 Donald Knuth 팬이든 다음 Larry Page가되고 싶든 놀랍도록 중요합니다. 귀하가 속한 사업체와 후보자 사이에서 명령 할 수있는 경쟁 수준에 따라 인터뷰에 다음 개념 중 일부를 포함시키는 것이 좋습니다.

정렬

  • 일종의 정렬 알고리즘 스케치.
  • 정렬 알고리즘의 몇 가지 예를 나열하십시오.
  • 성능 특성이 다른 두 종류를 비교 / 대비하십시오.
  • 그들이 메모리 사용을 언급하지 않으면 그것에 대해 물어보십시오.

수색

  • 가능한 많은 검색 알고리즘의 이름을 지정하십시오.
  • 두 검색 알고리즘을 비교 / 대비합니다.
  • 선형 검색 이외의 검색을 스케치하십시오.

일부 사람들은 인터넷 연결이없는 무인도에 작업이 없다면 이러한 알고리즘에 대한 코드를 요구하는 것은 과도하다고 말합니다. 또 다른 고려 사항은 30 분이 있고 많은 후보자에게 다른 것을 묻고 싶다면 정렬을 구현하는 데 많은 시간이 걸릴 수 있다는 것입니다.


나는 사람들에게 인터뷰 프로그램을 요청하는 것이 어리석은 일이라고 생각했지만, 이력 적으로 보이는 이력서를 가진 사람들의 수와 날아 다니는 색상으로 "사회적"질문에 대답하는 사람을 믿지 않을 것입니다. 'strcat'의 올바른 구현 또는 다른 간단한 함수를 적어 두십시오. 여러 번 이것은 바보 같은 코딩 문제가 아니더라도 끝없는 슬픔을 유발하고 무능력으로 팀을 끌어들일 수있는 누군가를 고용하지 못하게했습니다.
래리 그 리츠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.