그러나 면접에서의 면수 알고리즘에는 면수 프로젝트에서 거의 사용할 수 없는 알고리즘도 불합리하다고 할 수 없다. 알고리즘은 종종 학습과 이해력의 시금석이며, 어려운 것은 모두 파악할 수 있고, 쉬운 것은 왕왕 말할 것도 없다. 상층에 뜻이 있는 사람은 중층으로부터 이익을 얻을 것이다. 반대로 그렇지 않다. 반면에 교과서에 있는 알고리즘은 대부분 사용해도 모듈에서 직접 사용하지만, 유감스럽게도 벽돌을 옮기는 사람들은 때때로 발명자로서 무언가를 해야 한다. 아니면 알고리즘을 화이트박스로 개선하여 수중의 구체적인 요구를 충족시켜야 한다. (윌리엄 셰익스피어, 템플릿, 과학명언) 또는 단순히 바퀴를 발명하십시오. 따라서 면접 알고리즘 자체는 반드시 구비되는 것은 아니지만, 각종 알고리즘에 익숙한 사람들은 일반적으로 알고리즘의 사상에 익숙해지기 쉬우므로, 여기서 말하는 두 가지 능력을 갖추는 것이 더 쉽다.
그렇다면 알고리즘은 왜 어렵습니까? 이 문제에는 두 가지 가능한 이유가 있습니다.
알고리즘 자체는 매우 어렵습니다. 즉, 알고리즘 자체는 인간의 뇌에 매우 어려운 일이다.
그것은 나쁜 연설이었다.
이 두 가지 이유 모두 때문에 알고리즘이 대부분의 사람들에게 어렵다고 생각하는 이유는 다음과 같습니다.
우리는 알고리즘이 어렵다고 하는데, 두 가지 상황이 있다: 하나는 알고리즘이 배우기 어렵다는 것이다. 두 번째는 알고리즘 설계가 어렵다는 것이다. 전자를 위해, 대부분의 사람들 (적어도 나는 그 해 이렇게 했다) 학습 알고리즘은 거의 외울 정도로 외웠다. 마치 레시피를 외우는 것처럼 ('레시피' 는 광대한 농부들이 좋아하는 책) 하지만 알고리즘과 레시피의 차이점은 알고리즘에 포함된 세부 사항의 복잡성이 레시피의 무수히 많다는 점이다. 알고리즘의 문제는 변화무쌍하고 논리적 과정은 무궁무진하다. 대조적으로, 어떤 요리법도 몇 가지 기본 요소 (프로그래머는 좋은 요리사가 될 가능성이 있어야 함: D) 주의, 알고리즘의 증명을 읽어도 어느 정도는' 등' 이다. (왜 그렇게 말하는지, 우리 뒤에서 자세히 이야기해 보자.) (알버트 아인슈타인, Northern Exposure (미국 TV 드라마), 예술명언) 나 자신이 새로운 알고리즘을 만나면 기본적으로 증명을 볼 수 있지만, 찾은 후 곧 잊어버린다. 이것은 무턱대고 외우는 전형적인 증상이다. 만약 너도 알고리즘 책을 뜯어본 적이 있다면, 나는 네가 공감할 가능성이 매우 높다고 믿는다. 왜 그때 분명히 알고 있었는데, 얼마 지나지 않아 잊었니? 왜 당신은 당시 증명을 잘 알고 있었지만, 자신이 증명한 지 얼마 되지 않아 상교소에서 부족한 부분을 보충할 수 없다는 것을 발견하고 싶습니까?
중학교 기하학 증명을 할 때, 당신은 정리 증명서를 외울 정도로 어리석을 수 있습니까? 아니, 너는 결론을 외울 수밖에 없다. 왜요 한편으로는 증명 과정에 많은 세부 사항이 포함되어 있기 때문이다. 반면에 증명된 과정은 고리로 연결되어 있어 한두 가지 중요한 단계만 주의하면 스스로 유도할 수 있다. 알고리즘의 논리적 묘사는 정리와 같고, 알고리즘을 증명하는 과정은 정리를 증명하는 과정과 같다. 유감스럽게도 수학의 많은 간결한 기본 결론과는 달리 알고리즘의' 결론' 은 암송하기 쉽지 않다. 많은 경우, 알고리즘 자체의 논리는 증명 과정과 동일한 정보의 양을 거의 포함하고 있으며, 심지어 알고리즘 자체의 논리도 증명 과정이다. (고전적인 알고리즘 책을 한 권 펴서 몇 권의 고전적인 교과서 알고리즘을 보면 알고리즘의 논리가 알고리즘의 증명과 얼마나 밀접하게 연관되어 있는지 알 수 있다.) 그래서 우리는 방금 질문으로 돌아갔습니다. 당신은 수학 증명서를 외울 수 있습니까? 아무도 완전한 증명을 외울 만큼 어리석지 않은 이상, 왜 무뚝뚝하게 알고리즘을 외울 필요가 있는가?
그래서, 등을 돌리지 않으면 등을 돌리지 않고, 알고리즘의 증명을 이해하는 것은 어떻습니까? 알고리즘의 증명 과정을 이해하면 알고리즘의 논리적 세부 사항을 더 쉽게 기억하고 기억을 이해할 수 있다. 그러나 유감스럽게도, 대부분의 알고리즘 책들은 이 방면에서 매우 형편없고, 증명도 완벽하고, 논리도 상당히 엄격하다. 그러나, 알고리즘 발명가 본인이 어떻게 알고리즘과 알고리즘으로 증명된 사고 과정을 실제로 복원할 수 있는 작가는 없는 것 같다. 이치대로 말하면 증명 과정은 이런 사고 과정을 반영해야 하지만, 아래의 호프만 코딩에 관한 예에서, 사실, 호평을 받은 CLRS 와 알고리즘은 이 과정을 복원하지 않고 오히려 이 과정을 감추고 있다는 것을 알 수 있을 것이다.
어떤 작가도 고의로 이렇게 한 것은 아니지만, 자신이 이미 알고 있는 것을 설명할 때, 누구나 자기도 모르게 자신의 해석을 선형화 (예: 증명 문제) 한다는 것을 설명해야 한다. 고등학교가 평면 기하학 문제를 증명한 경험을 회상해 보면, 증명된 과정이 실제로' 비선형' 으로 가득 차 있다는 것을 알 수 있다. 예를 들면, 시험 착오, 연상, 역유도, 특례, 문제 조건 수정, 궁기 등이다. 교과서에 쓰여진 것처럼 혼돈의 과정-보조 정리 1, 보조 정리 2, 정리 1, 정리 2, 갑자기 최종 결론까지. 이 증명 과정은 이해하기 쉬울 수도 있지만, 절대 기억하기 쉽지 않다. 며칠 후, 당신은 하나 또는 몇 가지 보조 정리, 하나 또는 몇 가지 핵심 기술을 잊을 거 야, 그리고 다시가 서 자신을 증명 하려고 하면, 당신은 그것이 중요 한 장소에 갇혀 찾을 수 있습니다. 왜요 증명은 저자가 당시 증명 알고리즘에 이런 보조나 기교가 필요하다고 생각했던 이유를 알려주지 않았기 때문에, 증명서를 보면 알고리즘의 결론 원인을 알 수 있지만, 알고리즘 증명 과정의 원인은 알 수 없다. (존 F. 케네디, 과학명언) 우리 뇌의 기억 시스템에서, 새로운 지식은 기존 지식과 연결되어야만 쉽게 기억할 수 있다. (어떻게 효과적으로 배우고 기억할 수 있는가?) 링크가 많을수록 기억하기 쉽다. 하지만 비행 보조는 우리의 기존 지식과 아무런 연관이 없으며, 어머니가 없는 아이는 쉽게 잊혀질 수 있다. (윌리엄 셰익스피어, 햄릿, 가족명언) 왜 사고 과정을 되돌리기가 이렇게 어렵습니까? 나는 일찍이' 그 이유를 안다' 에서 서술한 적이 있다.
대부분의 알고리즘서에서의 비극적인 알고리즘 증명 과정 때문에 많은 사람들이 증명 자체가 기억하기 쉽지 않다는 것을 깨닫고 결론을 직접 기억하는 것이 더 바람직하다. (윌리엄 셰익스피어, 햄릿, 과학명언) 당시 나는 수학과, 시험 증명 과정에 있었지만, 컴퓨터과의 시험 알고리즘 증명 과정이 터무니없는 것 같았습니까? "엔지니어링" 프로그래밍으로서 사용과 결과에 더 많은 관심을 기울이는 것 같습니다. 하지만 프로젝트에서 스스로 알고리즘을 설계해야 한다면 어떨까요? 이때 네가 최소한 해야 할 일은 알고리즘의 정확성을 증명하는 것이다. 우리는 면접을 볼 때 알고리즘 설계 문제를 자주 만난다. 나는 항상 수험생에게 알고리즘의 정확성을 증명할 것을 요구한다. 왜냐하면' 정확해 보이는' 알고리즘이라도 쉽게 증명할 수 없기 때문이다.
따라서 대부분의 알고리즘 책은 훈련 알고리즘 디자이너의 관점에서 실패하며 수학 교육보다 더 실패합니다. 대부분의 사람들은 중학교 때 평면 기하학을 마친 후 증명 문제를 풀지만 (수학책은 기하학의 모든 정리를 기억할 필요가 없다), 많은 사람들이 알고리즘 책 한 권을 읽는 것은 여전히 엉망진창이다. 일부 기본 알고리즘은 증명할 수 없다. 우리의 결론 하나의 결론의 등은 많은 쓸모가 없을 뿐만 아니라, 함께 쓰는 것조차도 증명하지 못할 것이다. (윌리엄 셰익스피어, 햄릿, 결론명언) 왜 이런 차이가 있을까요? 수학 교육의 이상적인 목적은 새로운 정리를 발견할 수 있는 과학자가 되는 것이기 때문이다. 그러나 코드 농업과의 알고리즘 교육의 목적은 당신이 알고리즘으로 일을 할 수 있는 엔지니어가 될 수 있도록 하기 위해서이다. (존 F. 케네디, 공부명언) 그런데, 정말 그렇게 간단한가요? 그렇다면 알고리즘의 결론도 외울 필요가 없다. 알고리즘이 무엇을 하고 있는지, 시공간의 복잡성이 얼마인지 알면 된다.
위에서 언급한 알고리즘의 난이도 (해석과 기억의 난이도) 가 우연한 복잡성이라면 알고리즘의 또 다른 어려움은 본질적인 복잡성, 즉 알고리즘 설계다. 또는 수학적 증거를 비유로 사용하십시오 ("알고리즘 소개: 창조적 인 방법" 을 읽으면 알고리즘과 수학적 증명이 얼마나 유사한지 알 수 있습니다. ), 단지 증명에 비해, 알고리즘을 설계하는 데 어려움이 있는 것은 정리와 증명에 모두 네가 탐구해야 한다는 것이다. 특히 전자는 네가 직접 핵심 정리를 발견해야 한다는 것이다. (알버트 아인슈타인, 과학명언) 알려진 결론을 증명하는 것보다 (결론이 정확하다는 것을 알고 있고, 결론과 조건을 논리로만 연결시키기만 하면 된다), 이 일의 복잡성은 종종 한 단계 더 어려워진다. (알버트 아인슈타인, 지식명언)
한 가지 흥미로운 사실은 알고리즘 탐구 과정에 종종 알고리즘이 증명하는 과정이 포함된다는 것이다. 이상적인 알고리즘책은 알고리즘 탐구의 과정을 복원해야 하며, 독자가 스스로 증명된 과정을 추론할 수 있을 뿐만 아니라 새로운 알고리즘을 탐구할 수 있는 능력도 있어야 한다. 내가 이렇게 말하는 이유는 게으른 사람이기 때문이다. 게으른 사람은 항상 무언가를 배워서 다음 두 가지 목적을 달성하는 것을 꿈꾼다.
일로영일: 프로그래머들은' 한 번 쓰고 여기저기 뛰어다니다' 는 장점을 알고 있어 훨씬 쉬워요. 배우면 잊고, 잊고, 또 다시 배워야 하고, 또 다시 또 다시 생명을 낭비해야 한다는 것을 잊어버린다. (서양속담, 공부속담) 왜 한 번 보면 잊지 않는 거야? 잘 가르치지 못했나요, 아니면 잘 배우지 못했나요?
적은 노력으로 더 많은 일을 할 수 있습니다. 사실 프로그래머는 한 번의 편찬을 중시할 뿐만 아니라, "한 번의 편찬, 도처에서 사용" ("재사용" 이라고도 함) 도 중시합니다. 알고리즘을 배우면 얻은 경험을 어디에서나 사용할 수 있고, 하나를 10 개로 배우면, 널리 보급되면, 시간 활용의 효율성이 크게 향상될 것이다. 어떻게 해야만 외삽 경험의 효율을 극대화하는 것을 배울 수 있습니까?
이 두 가지를 하려면 가능한 한 지식 트리의' 루트 노드' 로 시작해야 한다. 수학에서' 뿌리 노드' 를 찾는 꿈 ('베리아로 문제를 푸는 역사') 과 같은 아름다운 꿈이지만, 고델의 증명은 꿈을 사라지게 한다 ('영원한 황금 대각선'). 그러나, 이것은 우리가 더 높은 수준의 노드, 즉 더 보편적인 문제 해결의 원칙과 방법을 찾는 것을 방해하지 않는다. 따라서 이상적인 알고리즘 책이나 알고리즘 설명은 가장 일반적인 사고 법칙에서 출발하여 알고리즘을 논리적으로 추론해야 한다. 이 과정은' 일반인' 의 사고 과정을 최대한 복원해야지,' 어떻게 생각할 수 있을까?' 라고 생각하게 하는 것이 아니라' 일반인' 의 사고 과정을 최대한 복원해야 한다. "
이 기사의 첫 번째 부분에서 언급한 호프만 코드를 예로 들어 보겠습니다. 호프만 코드를 처음 봤을 때 알고리즘 설명만 보고 직관적이었다. 2 년 후, 나는 왜 두 노드의 주파수를 합친 것이 하나의 노드인지 모르겠다. 만약 내가 왜' 왜' 를 모른다면 기억이 나지 않는다. (알버트 아인슈타인, Northern Exposure (미국 TV 드라마), 남녀명언) 왜' 가 이 일에 필연성을 제공했는지 알았다. 만약 당신이' 왜' 를 모른다면, 당신은 이것 혹은 저것을 선택할 수 있다. 우리의 뇌는 종종 다른 것들을 혼동하고, 이치에 맞는 것을 기억하기 쉽다. (정보론의 관점에서 볼 때, 필연적인 것의 확률은 1 이고, 대체물의 정보량은 0 이고, 대체물의 정보량은 0 보다 크다.) 두 번째 보기는 퇴근 후, 마침내 증명서가 필요하다는 것을 알게 되었다. 나는 유명한 알고리즘을 꺼내서 보면서 고개를 끄덕였다. 정말 좋은 것 같아요. 한 번 보면 왜 그런 최적의 코드트리를 만들어야 하는지 알 수 있어요. 하지만 얼마 지나지 않아, 나는 또 잊어버렸다! 이번에 나는 두 노드의 주파수를 합친 것이 아니라 내가 왜 이렇게 해야 하는지 까먹었다. 호프만은 내가 왜 그렇게 최적의 코드트리를 만들 수 있는지 이해할 수 없었기 때문이다. (빌 게이츠, Northern Exposure (미국 TV 드라마), 스포츠명언) 결국 나는 한 가지만 알고 다른 것은 모른다.
알고리즘의 결론 (즉, 알고리즘 논리) 에만 관심이 있다면 알고리즘의 증명을 이해하는 것으로 충분하다는 점에 유의해야 한다. 광백 알고리즘의 논리는 기억하기 어렵고, 증명을 이해하면 기억하기 쉽다. 그러나 알고리즘의 증명을 기억하려면 증명뿐만 아니라 배후의 사고, 즉 배후의 이유도 이해해야 한다. 후자는 일반적으로 책과 자료에서 찾기가 어렵고, 오직 너만이 알아낼 수 있다. 왜 이 신을 귀찮게 합니까? 결론을 잊지 않는 한, 끝나지 않습니까? 당신이 무엇을 하고 싶은지 보세요. 알고리즘 설계의 이면에 있는 생각을 진정으로 이해하고 싶다면, 알고리즘의 원작자가 어떻게 생각해냈는지 헤아려 보지 않는 것은 불가능합니다. (존 F. 케네디, 공부명언)