[Powered by Google Translate] [연습 - 문제 세트 6] [Zamyla 찬 - 하버드 대학교 (Harvard University)] [이 CS50입니다. - CS50.TV] 안녕하세요 여러분, 연습 6에 오신 것을 환영합니다 Huff'n 퍼프합니다. Huff'n 퍼프에서 우리는하는 일이 허프만 압축 파일로 처리 될 것입니다 다음, 백업을 피게 때문에, 그것을 압축을 푸는 우리는 0s와 1S 사용자가 우리에게 보내는에서 번역 할 수 있도록 그리고 원래 텍스트로 다시 변환합니다. 이 도구의 일부를 만나러가는 때문에 Pset 6 정말 멋진 될 것입니다 이 1 멋지다 개념으로 통합을 pset 4 pset 5 종류에 사용되는 당신이 생각 올 때. 또한, 확실하게, pset 4 및 5는 우리가 제공해야한다고 가장 어려운 psets했다. 그럼 지금부터, 우리는 C에서 1 개 pset가 그리고 그 후 우리는 웹 프로그래밍에있어. 따라서 CS50에서 가장 힘든 고비 점점을 위해 자신을 축하합니다. Huff'n 퍼프에의 이동이 pset에 대한 도구 상자는 허프만 나무가 될 것이다 그래서 이진 나무 작업뿐만 아니라 구체적으로 허프만 나무뿐만 아니라 어떻게 이해 어떻게가 건설하고 있습니다. 그리고 우리는이 pset에 대해 배포 코드를 많이 할거야 우리는 코드의 일부 실제로 만나러 와줄 거에요 우리는 아직 완전히 이해되지 않을 수 있습니다 그리고 그 후에는 함께. h 파일. C 파일 수 있지만 우리에게 우리가 이러한 기능이 어떻게 작동하는지 알 수 있도록 필요로하는 충분한 이해를 제공합니다 적어도 무엇을 어떻게해야 - 자신의 입력 및 출력 - 우리는 블랙 박스에 무슨 일이 일어나는 건지 모르겠어 경우에도 또는 내 블랙 박스에 일어나는 일을 이해하지 않습니다. 그리고 마지막으로, 평소처럼, 우리는 새로운 데이터 구조를 다루고있는 그 노드의 특정 유형은 어떤 일을 가리 그래서 여기에 디자인 과정뿐만 아니라 펜과 종이를 가지고 언제 당신이 pset가 작동하는 방법을 알아 내려고 노력 중입니다 뿐만 아니라 디버깅시. 이 값이 무엇인지 내려 동안, 당신의 펜과 종이와 함께 GDB를 가질 수 위치가 화살표가 가리키고, 그와 같은 것들입니다. 먼저 허프만 나무를 살펴 보자. 허프만 나무 각 노드는 어린이 2 인이 즉, 이진 나무입니다. 허프만 나무에서 특징입니다 가장 자주 값을 가장 적은 비트에 의해 표현된다. 우리는 모스 코드의 강의 예제, 통합 종류의 어떤 편지 보았다. 당신은 예를 들어 A 또는 E를 번역하려는 경우 당신이 자주 번역하고 있으므로 대신 비트의 전체 집합을 사용할 필요 그 일반적인 데이터 형식에 할당, 당신은 이하로 내려 압축 그리고 표현이 편지는 빈도 이상 비트로 표현 당신이 그 문자가 표시되는 주파수를 무게 때 그런 여유가 할수 있기 때문이다. 우리는 허프만 나무에 여기 같은 생각을 우리가 어디에 체인, 특정 문자까지가는 ​​경로의 종류를하고 있습니다. 그리고 가장 빈도가 문자 가장 적은 비트로 표현할 될 예정입니다. 당신은 허프만 트리를 구성하는 방법 텍스트에 표시되는 문자를 모두 배치하는 것입니다 하고 주파수를 계산, 얼마나 자주 나타납니다. 이 중 그 글자가 나타납니다 횟수의 수있을 수 아니면 하나 하나가 나타납니다 얼마나 많은 모든 문자에서의 비율입니다. 그리고 당신이 할 일은 일단 그 매핑에서의 모든이 있습니다 다음은 2 낮은 주파수를 찾아 다음 형제로 가입 곳에서 부모 노드는 2 명의 어린이의 합계입니다 주파수가 있습니다. 그리고 나서 대회로 그런 말을 왼쪽 노드, 당신은 0 지점을 따라 그렇게 따라 그리고 가장 오른쪽 노드는 한 가지입니다. 우리가 모스 부호에서 본 바와 같이, 한 잡았다 저 사람이 당신은 삐와 삐가 있다면 그것은 모호한했다. 이 중 한 글자 될 수 또는 2 문자의 순서가 될 수 있습니다. 그리고 무엇 허프만 나무가 않는 것은 캐릭터의 성격 때문에 또는 최종 실제 문자 분기의 마지막 노드 것 - 우리가 단풍으로 사람들에게 참조 -의 미덕하여 모호가 될 수 없습니다 당신이 비트 시리즈를 인코딩하려고하는 편지의 관점에서 때문에 한 문자를 나타냅니다 비트를 따라 어디 선가 갑자기 당신은 다른 모든 편지가 발생하고, 거기에 혼동이되지 않습니다. 하지만 우리는 당신들이 실제로 볼 수 예제로 가서 그 대신에 우리는 그 사실을 알리는. 가 허프만 트리의 간단한 예를 들어 보자. 나는 12 자 길이 여기에 문자열을 수 있습니다. 난 6 학사 2 C를,으로 4 있습니다. 내 첫 번째 단계는 계산하는 것이다. 몇 번이나 나타 납니까? 이 문자열에 4 번 나타납니다. B는 6 번 나타나며, C는 2 번 나타납니다. 물론, 제가, 가장 자주 B를 사용하고 말할거야 그래서 비트의 적은 수, 0s와 1S의 적은 번호로 B를 나타냅니다하고 싶습니다. 그리고 나는 또한 C는 물론 0s와 1S의 가장 금액을 필요로 기대 겠어. 우선 여기에 내가 뭘 주파수의 관점에서 오름차순으로 배치되어 있습니다. 우리는 C와 A는 그 우리의이 가장 낮은 주파수 것을 참조하십시오. 우리는 부모 노드를 만들고, 그 부모 노드는 관련 문자가 없습니다 하지만 합이 주파수를 지니고 있습니다. 합은 6입니다 2 + 4가됩니다. 그럼 우리가 왼쪽 지점을 따르십시오. 우리가 여섯 노드에 있다면, 우리는 C에 도착하려면 0를 따를 겁니다 그리고 1 A.을 받기 위해 이제 우리는 두 노드가 있습니다. 우리는 값이 6이 후 우리는 또한 값이 6 다른 노드가 있습니다. 그리고 그 둘은 최저 2뿐만 아니라 남아있는 단지 2뿐만 아니라 아르 그래서 우리는 합계는 12이되면, 다른 부모의 사람들을 가입 할 수 있습니다. 그래서 여기에 우리가 우리의 허프만 트리를 B로 이동 곳, 그냥 비트 1 것 다음에 가야 우리는 C가 00 문제 다음 01 가지고 것입니다. 그래서 여기에 우리가 기본적으로 우리가 1 또는 2 비트 중 하나와 함께이 문자를 대표하고 있는지 확인 어디에 예측 B은, 적어도이 있습니다. 그리고, 우리는 C가 가장 많이가 예상하지만, 이렇게 작은 허프만 트리인데 다음은로 중간에 어딘가에 반대하는 2 비트으로 표시됩니다. 그냥 허프만 트리의 또 다른 간단한 예를 통해 이동하려면, 당신이 문자열을 가지고 말 "안녕하세요." 당신이 할 일은 당신이 몇 번 H이에 나타나지 않는 말 것 처음이다? H 한 번하고 전자가 나타납니다 나타나면, 그리고 나서 우리는 두 번 나타나는 리터가 및 O 한 번 게재. 그리고 나서 우리는 비트의 최소 숫자로 표시 할 수있는 편지 기대? [학생] 리터. >>의 리터. 그래. 내가 맞아. 우리는 리터는 비트의 최소 숫자로 표시 될 것으로 예상 때문에 나는 "안녕하세요."문자열에 가장 많이 사용됩니다 지금해야 할 일이 노드를 끌어 있습니다. 나는 다음에 o이 전자 또 다른 1 다음 1을, H입니다, 1를 가지고 있고, - 리터입니다 후 2 - 지금은 순서로하겠습니다. 그래서 내가 허프만 트리를 빌드하는 방법은 최소 주파수와 2 노드를 찾을 것입니다라고 그리고 부모 노드를 만들어 그들에게 형제를합니다. 여기서 우리는 가장 낮은 주파수가있는 3 개의 노드가 있습니다. 모두 하나하고 있습니다. 그래서 여기에 우리가 우리가 처음 연결하는 것 어느 선택합니다. 자, 내가 H와 E를 선택 말한다. 1의 합계 + 1은 2이지만,이 노드가와 관련된 편지를 가지고 있지 않습니다. 단지의 가치를 보유하고 있습니다. 이제 우리는 다음 2 낮은 주파수에서 봐. 그래서 2 1. 그것도 그 2 수도 있지만이 하나를 선택하는거야. 합은 3입니다. 그리고 마지막으로, 난 단지 왜 그렇게 후 5되거나, 두 왼쪽을 갖추고 있습니다. 그의 인코딩을 입력하면 다음 여기, 등, 예상, 1 초 항상 오른쪽 지점과 0s은 왼쪽이 있습니다. 그럼 우리가 2 일까지 단 1 비트와 다음 O로 표시 리터가 그리고 2로 전자 후 H는 3 비트 아래로 떨어집니다. 그럼 당신은 "안녕하세요"이 메시지를 전송할 수 대신 실제로 문자를 사용 단지 0s와 1 초에 의해. 그러나, 몇 가지 경우에 우리는 주파수와 관계가 있다는 기억 해요. 우리는 하나 어쩌면 먼저 H와 O를 함께 할 수 있었 잖아. 아니면 나중에 우리는 2로 표시 나도했을 때에 뿐만 아니라 2에 의해 표현 하나를 가입, 우리는 어느 하나 연결했습니다 수 있습니다. 그리고 보낼 때 0s와 1S, 실제로 보장하지 않는 받는 사람은 완전히 바로 박쥐에서 메시지를 읽을 수 그들은 당신이 만든 어떤 결정이 잘되지 않을 수 있습니다 때문입니다. 그래서 우리는 허프만 압축을 상대 할 때 어떻게 든 우리가 결정하는 방법 우리 메시지의받는 사람에게 얘기를 해 - 그들은 추가 정보의 일부 종류를 알 필요가 압축 된 메시지를 기입해야합니다. 그들은 나무가 실제로 어떻게 생겼는지 이해할 필요가 우리는 실제로 이러한 결정을하는 방법. 여기 우리는, 실제 개수에 따라 예를하고 있었 하지만 가끔은 또한 허프만 트리를 가질 수 주파수에 따라 문자가 나타납니다, 그것은 동일한 과정을 할 것인지. 난 여기, 비율 또는 분수의 측면에서 표현 하려는데 그래서 여기에 똑같이. 나는 2 최저 그들을 합계, 최저 다음 2 그들을 합계 찾을 수 나는 전체 트리를 때까지. 우리는 그것을 우리가 백분율 상대가 어느 쪽이든, 할 수 있지만 우리가 일을 나누어하고 소수점을 상대하고있는 나보다는 떠 그 우리는 머리의 데이터 구조에 대해 생각하는 경우. 우리는 수레에 대해 뭘 알고 있지? 우리가 수레 상대가 일반적인 문제는 무엇입니까? [학생] 부정확 한 연산. >> 그래. 부정확. 때문에 부동 소수점 부정확으로 인해이 pset에 대해 우리는 확인하도록 우리가 어떤 가치를 잃게하지 않는 것이, 우리는 실제로 수를 처리 할거야. 당신이 여기의 구조로 보면, 퍼레이드 노드의 생각 있었다면 당신이 녹색을 보면 그것이와 관련된 주파수가 뿐만 아니라은 왼쪽 노드뿐만 아니라 오른쪽으로 노드 가리 킵니다. 그리고 붉은 색이 아니라 그들과 관련된 문자가 있습니다. 우리는 부모와 후 최종 노드에 대해 별도의 사람을 만들려고하지 있는 우리는 단풍으로 참조, 오히려 그는 NULL 값을 갖게됩니다. 모든 노드에 대해 우리는 문자 그 노드가 나타내는 기호를해야합니다 다음 주파수뿐만 아니라 왼쪽 자녀뿐만 아니라 오른쪽 자녀에 대한 포인터. 맨 아래에 있습니다 잎은 또한 노드 포인터를 가지고 것입니다 자신의 왼쪽과 오른쪽에, 그러나 그 값이 실제 노드에 연결되지 않기 때문에, 의 값은 어떤 것입니까? >> [학생] NULL. >>의 NULL. 그렇지. 다음은 수레에 주파수를 나타낼 수있는 방법에 대한 예를 들어, 좋은 데요 하지만 우리는 정수로 처리 할 것 그래서 내가 한 모든이 데이터 유형을 변경합니다. 의는 복잡한 예제의 조금 더에 가자. 그러나 지금 우리는 간단한 사항을 수행 한, 단지 동일한 프로세스입니다. 당신은이 낮은 주파수를 찾아 주파수를 합계 그는 부모 노드의 새로운 주파수입니다 이는 다음 한 지점과 0 지회와 오른손으로는 왼쪽을 가리 킵니다. 우리는 문자열 "이 cs50입니다,"이 있다면 우리는 T 언급 횟수를 계산 H는 언급, 난, S, C, 5, 0. 그리고 내가 여기서 한 것은 그냥 심어 빨간색 노드와 함께 내 나무의 하단에 결국 이러한 문자를 가졌어요 말했다. 사람들은 잎의 모든 될 것이다. 그리고 제가 한 건, 제가 오름차순으로 주파수별로 정렬됩니다 이 실제로 pset 코드가 않는 방법입니다 이 빈도를 기준으로 정렬을하고 알파벳입니다. 그래서 주파수의 알파벳 순으로 첫 번째와 다음 번호가 있습니다. 그럼 뭐 내가 어떻게하면 제가 2 낮은을 찾을 것입니다. 그는 0과 5입니다. 난 그것들을 표현한 다면요, 그 2입니다. 그럼 난 다음 2 최저를 찾아 계속합니다. 사람들은 두 1 초이며, 다음이도이된다. 지금은 내 다음 단계는, 가장 낮은 번호를 가입 할 간다는 걸 알고 이는, 1 T이며, 다음 주파수로 2가있는 노드 중 하나를 선택. 그래서 여기에 우리가 3 가지 옵션이 있습니다. 나는 슬라이드를 위해 뭘 할 건지 단지 시각적으로 당신을 다시 정렬 할 수 있습니다 수 있도록 당신은 내가 구축 중이 방법을 볼 수 있습니다. 코드 및 배포 코드가 무슨 짓을할지 것은 T를 가입됩니다 0과 5 노드와. 그럼 다음 3 총액, 그리고 우리가이 프로세스를 계속하는 것이. 2 2 이제 그럼, 4 해당 금액을 최저 수 있습니다. 모두가 지금까지 따라? 좋아요. 그 뒤 우리는 3까지 추가해야 3가 당신이 너무 지저분 해지하지 않는 눈 때문에 볼 수 있도록 그래서, 난 그냥 전환거야. 우리가 불과 2 노드를 가지고 나서 우리는 6이 후 우리의 마지막 단계는 지금 우리는 10 개입니다 우리 트리의 루트를 만들기 위해 사람들을 합계. 각 노드는 표현 때문에 수 (10)는, 의미가 자신의 가치, 자신의 주파수 번호, 그들은 문자열에 나타난 몇 번했다 그리고 우리는 문자열에 5 문자를 가지고 의미가 있도록 말이다. 우리는 실제로 인코딩 방식을 올려다 보면 예상대로, 내가하고 가장 자주 나타나는 초, 비트 적은 숫자로 표시됩니다. 여기에주의하십시오. 허프만 나무의 경우는 실제로 문제. 대문자 S는 소문자 S 다릅니다. 우리가 가진 경우, 소문자 s에 두 번 만 나타납니다 다음, 대문자로 "이 CS50이다" 그 값으로 2 노드 될 후 대문자 S는 한 번만 것이다. 당신이 실제로 여기에 추가 잎을 가지고 있기 때문에 그래서 당신의 나무 구조를 변경합니다. 그러나 합 여전히 10 것입니다. 즉, 우리가 실제로 체크섬를 호출 할 것이야 카운트의 모든 추가. 이제 우리는 허프만 트리를 적용 한, 우리는 Huff'n 퍼프, pset에 뛰어 수 있습니다. 우리는 질문의 한 부분으로 시작 할거야 이은 진 나무와 그 주변에 작동하는 데 익숙해 얻을 수 있습니다 : 그림 노드, 노드에 대한 자신의 typedef 구조체를 생성, 그리고 이진 트리, 정렬있어 하나에 삽입하는 방법을보고, 그, 그와 같은 일을 가로 지르는. 그 지식은 확실히 Huff'n 퍼프 부분에 때 다이빙을 도움이 될 수 있습니다 pset의. pset의 표준 버전에서 귀하의 작업은, 퐁퐁을 구현하는 것입니다 그리고 해커 버전에서 작업 후우을 구현하는 것입니다. 후우는 무엇을, 그것은 텍스트를 소요하고는 0s와 1 초에 변환 저희가 주파수를 계산 어디에 위 한하는 절차 다음 트리를 만든 후, 말 "내가 T하려면 어떻게해야합니까?" T는 100으로 표시됩니다, 그런 일, 그리고 후우은 텍스트 다음 출력이 진을 것입니다. 뿐만 아니라 우리는 우리가 메시지의 우리의 수신자를 허용 할 알고 있기 때문에 동일한 나무를 다시, 또한 주파수 카운트에 대한 정보가 포함되어 있습니다. 그런 다음 퐁퐁으로 우리는 0s와 1S의 바이너리 파일이 제공됩니다 또한 주파수에 대한 정보를 제공. 우리는있는 원본 메시지에 해당 0s와 1S 다시 모든 번역 그래서 우리는 그런 압축을 푸는하고 있습니다. 당신은 표준 버전을 수행하는 경우, 당신은 후우을 구현 할 필요가 없습니다 그럼 당신은 후우의 직원 구현을 사용할 수 있습니다. 하는 작업을 수행하는 방법에 대한 사양의 지시가 있습니다. 당신은 특정 텍스트 파일에 후우의 직원 구현을 실행할 수 있습니다 그리고 퍼프하기 위해 입력으로 해당 출력을 사용합니다. 내가 전에 언급했듯이, 우리는이 하나의 배포 코드를 많이 가지고 있어요. 나는에서부터 시작 겠어. 나는에 대부분의 시간을 보낼거야. H 파일 우리는. H가 있기 때문에. C 파일에 있기 때문에 그는 함수의 프로토 타입으로 우리를 제공합니다 우리는 완전히 정확히 이해 할 필요가 없습니다 - 당신이. C 파일에 어떤 일이 일어나고 있는지 이해하지 않으면, 너무 걱정하지 마세요 그 어떤 힌트를 줄 수 있기 때문에하지만 확실히 살펴보세요 그리고 다른 사람의 코드를 읽고에 익숙해 유용합니다. huffile.h을 보면, 댓글이 허프만 코딩 된 파일에 대한 추상화 계층을 선언합니다. 우리가 내려 가면, 우리는 우리가 코드를해야 할 수도있는 256 기호의 최대 있다는 것을 참조하십시오. 대문자와 소문자 - -이 알파벳의 모든 글자를 포함 그리고 기호와 숫자 등 그럼 여기서 우리는 허프만 코딩 된 파일을 식별하는 마법의 숫자가 있습니다. 허프만 코드 내에서 그들은 특정 마법 번호가 할거야 헤더와 연관된. 이, 그냥 임의의 마법 번호 같이 보일 수 있습니다 당신이 실제로 ASCII로 번역 으면, 실제로 발끈를 해보면. 여기 허프만 인코딩 파일에 대한 구조체가 있습니다. 후우 파일과 관련된 이러한 특성의 모든이 있어요. 그런 다음 여기 우리가 후우 파일에 대한 헤더를 가지고, 그래서 우리는 Huffeader 전화 대신 어쨌든 같은 소리 때문에 여분의 H를 추가. 귀여운. 우리는과 관련된 매직 넘버가 있습니다. 는 실제 후우 파일의 경우, 최대 위의이 마법 하나 번호 것 같네요. 그리고 그 배열을해야합니다. 따라서 각 기호에 대해, 그 중 256, 있습니다 그것은 그 기호의 주파수가 후우 파일 내에 어떤 목록을 표시 할거야. 그리고 마지막으로, 우리는 주파수에 대한 체크섬이 이는 그 주파수의 합해야합니다. 그럼 증거가 Huffeader입니다. 그런 다음 우리는 후우 파일에 다음 비트를 반환 일부 기능이 뿐만 아니라 hfclose, 여기서이 함수를 다음 후우 파일에 비트를 작성하고, 그 실제로 후우 파일을 닫습니다. 전에, 우리는 바로 바로 fclose 처리되었습니다 하지만 후우 파일이있을 때, 대신에 fclosing의 당신이 실제로 할 수있는 일은 것은 hfclose하고 hfopen입니다. 그것들은 우리가 상대해야 할 것 같군 후우 파일에 특정 기능입니다. 그럼 여기서 우리는 헤더에 읽고 다음 헤더를 써주세요. 그냥. H 파일을 읽어 우리는 후우 파일이 될 일을 파악할 종류의 수 그것은 실제로 huffile.c로하지 않고, 가지고있는 특성 이는 우리가 다이빙을하면 좀 더 복잡한 될 것입니다. 이 I / O는 여기에 포인터를 처리 파일을 모두 있습니다. 여기 우리는 hfread를 호출 할 때, 예를 들어, 아직도 fread과 대항하는 것을 볼 수 있습니다. 우리는 완전히 그 기능을 떼어 버릴 수는 없을 걸,하지만 우리는을 처리 할 사람들을 보내는 대신 자신의 모든 일을하는 후우 파일에서. 당신이 궁금해 할까이 스캔 무료로 느낄 수 그리고 가서 다시 레이어 조금 껍질을 벗기면. 우리가 보는거야 그 다음 파일 tree.h.입니다 연습은 슬라이드에 전에 우리는 호프만 노드를 기대했다 우리는 typedef 구조체 노드를했습니다. 우리는 상징, 주파수, 그리고 두 노드 별을 가지고 기대하고 있습니다. 이 경우 우리가하고있는 것은이 본질적으로 동일합니다 대신 노드의 경우를 제외하고 우리가 나무 전화 할거야. 우리는 당신이 나무를 호출 할 때 당신에게 나무 포인터를 반환하는 기능을 갖추고 있습니다. 당신이 새로운 노드를 만들 때, 도전자로 돌아 가기 당신이 말한 노드 * 새 단어 = malloc (sizeof)와 같은거야. 기본적으로 mktree 당신을 위해 그 처리 될 예정입니다. 마찬가지로, 당신은 나무를 제거 할 때, 그래서은 본질적으로, 당신이 그것으로 완료 나무를 자유롭게 있어요 대신 명시 적으로 그 무료로 전화, 당신이 실제로 rmtree 기능을 사용 할거야 그런 다음 그 나무에 포인터를 전달하고있는 tree.c가 그 처리를 취할 것입니다. 우리는 tree.c. 조사 우리는뿐만 아니라 구현을 참조하는 경우를 제외하고 동일한 기능을 기대합니다. 우리가 예상했던대로, 당신이 mktree 호출 할 때 그것은 포인터로 나무의 크기를 mallocs NULL 값 때문에 0s 또는 NULLs에 값을 모두 초기화 다음 단지 너에게 malloc'd 한 저 나무로 포인터를 반환합니다. 다음은 나무를 제거 전화 할 때 먼저 더블 자유롭게하지 않도록합니다. 당신이 실제로 제거 할 나무가 있는지 확인합니다. 나무는 또한 어린이를 포함, 여기를하기 때문에 이건 무엇을 그것은 재귀 트리의 왼쪽 노드에서 트리를 삭제 호출 뿐만 아니라 오른쪽 노드 있습니다. 그것이 부모를 자유롭게하기 전에뿐만 아니라 아이들을 해방해야합니다. 부모는 또한 루트와 호환됩니다. 그래서 고조 고조 할아버지와 같은 최초의 부모, 또는 할머니 나무는 먼저 우리가 처음 수준을 확보해야합니다. 그럼 그 무료로 아래로 통과 한 후 그 등을 다시 무료로 올라 와서 그래서 그 나무입니다. 이제 우리는 숲보세요. 귀하의 허프만 나무의 모든 곳은 숲입니다. 이 음모라고, 우리가 뭔가를 봐야한다는 이야기를하는 거지 그 나무에 대한 포인터뿐만 아니라 옆라는 플롯에 대한 포인터가 포함되어 있습니다. 어떤 구조가 같아 보이는 이런 종류의 무엇입니까? 그것은 가지 저쪽 말합니다. 바로 여기 야. 연결 목록입니다. 우리는 음모를 가지고 때 플롯의 연결리스트 같은 것을 볼 수 있습니다. 숲은 플롯의 연결리스트로 정의됩니다 그리고 숲의 구조는 우리가 우리가 처음 계획에 대한 포인터를 가야는거야 그 음모는 내 나무가 나 대신 나무에 가리 그리고 등등 등등 다음 플롯을 가리 킵니다. 숲을 만들려면 우리는 mkforest를 호출합니다. 그럼 우리가 여기서 꽤 유용한 기능을 가지고 있습니다. 이 반환 값은 트리 *이 다음 숲에 합격하고있는 우리는 선택해야 나무에 대한 포인터. 어떤 피크가 어떻게하면을 가리키고 있는지 그 숲에 들어갈 것입니다 해당 포리스트에서 가장 낮은 빈도로 나무를 제거 그리고 저 나무로 여러분에게 포인터를 제공합니다. 당신이 선택 호출되면, 나무는 더 이상 숲에 존재하지 않습니다 하지만 반환 값은 그 나무에 포인터입니다. 그럼 당신은 공장을 갖추고 있습니다. 이 아닌-0 주파수가 나무에 대한 포인터를 전달하는 한, 어떤 공장 할 것은, 숲을 나무를하고, 공장 것입니다 그 숲의 나무 내부. 여기 rmforest 있습니다. 기본적으로 우리의 나무를 모두 해제 나무, 삭제와 마찬가지로 숲을 제거 숲 속에 포함 된 무료 모든 것이다. 우리가 forest.c으로 보면, 우리는 거기에 최소 1 rmtree 명령을 볼 것으로 예상됩니다 때문에 숲 안에 나무가있는 경우 숲에서 무료로 메모리, 결국, 당신도 그 나무를 제거해야 할거야. 우리가 forest.c으로 보면, 우리는 우리가 예상 한대로이 우리 mkforest을 수 있습니다. 우리는 malloc 일을. 가로 시작하는 비 때문에, NULL로 숲의 첫 번째 음모를 초기화 그러면 우리는 가장 낮은 무게로 나무를 반환 곡괭이, 가장 낮은 주파수를 참조 그리고 특정 노드의 못된 그 저 나무로 포인트와 다음, 그래서 숲의 연결리스트에서 그을 해결합니다. 그리고 여기에 우리는 어떤 연결리스트에 삽입하는 나무를 심는를 갖추고 있습니다. 어떤 숲이 멋지게은 우리를 위해 정렬 유지 않습니다. 그리고 마지막으로, 우리는 예상대로, 우리가 호출 rmtree 가지고 rmforest을합니다. 지금까지 배포 코드를 보면, huffile.c는 이해하기까지 가장 힘든가 아마도 다른 파일 반면 자체는 따라하기가 아주 간단했다. 포인터와 링크 된 목록과 같은 우리의 지식, 우리는 아주 잘 따라 할 수 있었다. 하지만 우리가 정말 우리가 완전히 이해했는지 확인하기 위해 필요한 것은. h 파일입니다 당신은 그 반환 값으로 처리, 해당 함수를 호출 할 필요가 있기 때문에 따라서 완전히 수행 할 것입니다 어떤 작업을 이해했는지 확인 당신이 그 기능 중 하나를 호출 할 때마다. 하지만 사실 이건 내부 이해하는 것은 우리가 사람들을 가지고 있기 때문에 상당히 필요가 없습니다. h 파일. 우리는 우리의 배포 코드에 남아 둘 이상의 파일이 있습니다. 가 덤프 살펴 보도록하겠습니다. 여기의 댓글로 덤프 허프만 압축 파일을 걸립니다 그리고 번역 및 덤프의 모든 콘텐츠 아웃. 여기 우리는 hfopen를 호출한다는 참조하십시오. 이 * 입력 할 = fopen을 제기 할 미러링 종류입니다 그리고 당신은 정보를 전달합니다. 그것은 대신에 당신이 Huffile에 전달하는 파일 *의 경우를 제외하고 거의 동일입니다; 대신 fopen의 당신은 hfopen를 전달하고 있습니다. 여기 가지 우리가 헤더에 읽는 방법과 유사입니다 먼저 헤더에 읽기 비트 맵 파일. 우리가 여기서하는 것은 확인하여인지 여부를 헤더 정보 는 실제 후우 파일의 것을 나타냅니다 오른쪽 마법 번호를 포함 그런 다음 확인하려면 다음 수표 모두가 열려있는 실제 huffed 파일이나하지하는 파일이. 이게 않는 것은 우리가 볼 수있는 상징의 모든 주파수를 출력합니다 그래픽 테이블에 터미널 내에 있습니다. 이 부분은 유용 할 것입니다. 이 비트를 가지고 있으며 가변 비트에 조금씩를 읽고 다음을 출력합니다. 나는 파일을 피 우니의 결과 hth.bin에 덤프에 전화를 건다면 직원 솔루션을 사용하여,이를 것입니다. 그것은 이러한 문자를 모두 출력하고는 게재되는 빈도를 태우고있다. 우리가 보면, 대부분이 경우를 제외하고 0s 위치 : 두 번 나타납니다 H,, 그리고 한 번 나타납니다 T,. 그리고 여기에 우리는 0s와 1 초에 실제 메시지가 있습니다. 우리가 hth.txt 보면되는데,이, 아마 huffed 된 원본 메시지입니다 우리는 거기에 몇 가지 안녕하세요!와 TS를 볼 것으로 기대합니다. 특히, 우리는 단 1 T 2 안녕하세요!를 볼 것으로 기대합니다. 여기 hth.txt에 있습니다. 그것은 실제로 HTH 있습니다. 우리가 볼 수 있지만, 거기에 포함 된 줄 바꿈 문자입니다. 후우 파일 hth.bin는 또한뿐만 아니라 줄 바꿈 문자를 인코딩합니다. 여기 우리는 주문 바꿈 한 후 HTH와 것을 알고 있기 때문에 우리는 하나 (1)에 의해 아마 H가 표시되는 것을 볼 수 있습니다 그리고 T는 아마 01이며, 그 다음 H는 1도 그리고 우리는 두 0s로 표시 바꿈을 갖추고 있습니다. 좋아. 그리고 마지막으로, 우리는 여러. C를 처리합니다. 때문에 H 파일 우리는 컴파일러에 매우 복잡 주장을 할거야 그래서 여기 당신을 위해 덤프를 만드는 메이크 있습니다. 그러나 실제로, 당신은 자신의 puff.c 파일을 높이는 방법에 대한 가야 해. 메이크는 실제로 당신을 위해 puff.c을 처리하지 않습니다. 우리는 메이크 파일을 편집 할에 해당을 떠난다. 당신이하는 모든 같은 명령을 입력하면, 예를 들어, 당신을 위해 모든 할 것입니다. 과거 pset에서 메이크 파일의 예를 볼 주시기 바랍니다 뿐만 아니라 귀하의 퍼프 파일을 만들 수 방법에 대해 알아 보려면이 하나 벗어 이 메이크 파일을 편집하여. 그건 우리의 유통 코드에 대해입니다. 우리가 첨부터 끝까지 읽어 본 후, 여기에 그냥 다른 기억 어떻게 우리는 호프만 노드를 처리 할거야. 우리는 더 이상 노드 전화 할 수 할 수 없어, 우리는 그들에게 나무를 호출 할 것 우리가 숯불 자신의 기호를 대표 할가는 곳, 자신의 주파수, 정수와 사건의 수입니다. 이 수레보다 더 정확한이기 때문에 우리가 그걸를 사용하고 있습니다. 그리고 우리는 왼쪽 자녀뿐만 아니라 오른쪽 자녀에게 또 다른 포인터가 있습니다. 숲은 우리가 본대로, 단지 나무의 연결된 목록입니다. 결국, 우리는 후우 파일을 구축 할 때, 우리는 우리의 숲이 단 1 나무를 포함 할 - 한 나무, 여러 어린이들과 한 뿌리. 이전 우리가 우리의 허프만 트리를 만들 때에, 우리는 우리의 화면에 노드를 모두 배치에 의해 시작 그리고, 우리가이 노드를 할거야 말을 결국은 잎이 될거야,이 자신의 상징이 자신의 주파수입니다. 우리는 불과 3 글자가있는 경우의 숲, 그 3 나무의 숲입니다. 그리고 우리는, 우리가 처음 부모를 추가 할 때, 계속으로 우리는이 나무의 숲을했습니다. 우리는 숲에서 아이들의 2를 삭제 한 다음 부모 노드로 대체 그 아이들과 같은 사람들이 노드를했다. 그리고 마지막으로, 우리의 마지막으로, 학사 학위의 예를하고있는 단계, 그리고 C를 최종 부모를 만들기 위해 것, 그리고 다음 1로 숲의 나무의 총 개수를 가져 겠지요. 모두가 당신이 숲에서 여러 나무와 함께 시작하는 방법을 참조하십시오 않습니​​다 과 1을 끝? 좋아요. 좋아. 우리는 퐁퐁을 위해 어떻게해야합니까? 우리가해야 할 것은 언제나, 그들은 우리에게 입력의 오른쪽 유형을 지정하도록 is 우리는 실제로 프로그램을 실행할 수 있도록. 이 경우 사람들은 첫 번째 명령 줄 인수 후 회사를 제공 할 것 2 개 : 우리가 압축 및 압축 해제 파일의 출력 할 파일. 그러나 일단 그들이 값의 오른쪽 금액에서 우리를 통과해야합니다 우리는 입력 후우 파일인지 확인하고 싶습니다. 그리고 일단 우리는, 우리는 우리의 트리를 작성하려면, 그것이 후우 파일의 보장 이 메시지를 보낸 사람이 만든 나무를 일치 등의 나무를 구축 할 수 있습니다. 우리가 나무를 구축 후, 다음에 우리가 함께 0s하고에 전달하는 1 초,를 처리 할 수 가 동일이기 때문에, 우리의 나무를 따라 사람들을 따라 다음, 해당 메시지를 작성 문자로 다시 비트를 해석한다. 그리고 마지막에 우리는 여기에 포인터를 다루고 있기 때문에 우리는 우리가 어떤 메모리 누수가되지 않도록하려면 그리고 우리 자유 다. 적절한 사용을 보장하는 것은 지금의 우리를 위해 낡은 모자입니다. 우리는 입력에 타고있는이 부풀려 파일의 이름 것​​입니다, 그리고 우리는 출력을 지정 그래서 텍스트 파일 될 팽화 출력에 대한 파일의 이름입니다. 그 사용입니다. 그리고 지금 우리는 입력이 huffed하거나되지 않도록하고 싶습니다. 다시 생각 우리에게 도움을 줄 수있는 배포 코드에 없나요했습니다 파일이 huffed 여부를 이해하십니까? Huffeader에 대한 huffile.c의 정보가 발생했습니다. 우리는 모든 후우 파일 매직 넘버와 함께와 관련된 Huffeader이 알고 각 기호에 대한 주파수뿐만 아니라 배열 뿐만 아니라 체크섬 있습니다. 우리는 알고 있지만, 우리는 또한, dump.c에서 살짝했다 있는이 후우 파일로 읽었어요. 그리고 그렇게하려면 그것이 정말 huffed이나되지 않았습니다 여부를 확인했다. 그래서 아마도 우리가 우리 puff.c.에 대한 구조 dump.c 사용할 수 있습니다 다시 pset 4 우리가 RGB의 트리플에 복사 한 파일 copy.c을했을 때 우리는, 추리 소설과 크기 조정에 대한 그런 해석 마찬가지로, 당신이 할 수있는 것은 바로 CP dump.c puff.c과 같은 명령을 실행합니다 그리고 코드의 일부를 사용합니다. 그러나, 프로세스의로 간단 않을거야 puff.c에 dump.c 번역을위한, 하지만 적어도 시작 어딘가를 제공합니다 입력이 실제로 huffed하거나되지 않도록하는 방법에 뿐만 아니라 다른 몇 가지 있습니다. 우리는 적절한 사용을 보장하고 입력이 huffed 것을 보장합니다. 우리가 우리 적절한 오류 검사를 수행 한 한 때마다, 그래서 문제가있을 경우, 재 및 일부 오류가 발생할 경우 기능을 종료. 지금 우리가 원하는 것은 실제 트리를 구축합니다. 우리가 숲을 보면, 2의 주요 기능이 있습니다 우리는 매우 익숙하게하려는 것 같군. 이 부울 함수의 공장은 우리의 숲 안에 비-0 주파수 나무 식물. 그리고 거기에는 숲과 나무에 대한 포인터에 대한 포인터를 전달합니다. 빠른 질문 : 당신은 허프만 트리를 구축 할 때 얼마나 많은 숲이 가능한가? 우리 숲은 이제 우리의 캔버스처럼입니까? 그래서 우리는 단 1 숲을받을거야,하지만 우리는 여러 나무를 할 겁니다. 이 공장 전화 따라서 전에 아마 당신의 숲을 만들고 싶어거야. 당신이 숲을 만들 수있는 방법에 forest.h에 보면 명령은 거기에 있습니다. 당신은 나무를 심는 할 수 있습니다. 우리가 그렇게 작업을 수행하는 방법을 알아요. 그리고 당신은 또한, 숲에서 나무를 선택할 수 있습니다 낮은 무게로 나무를 제거하고 여러분에게 포인터를 제공. 우리는 사례를 자신을하고있을 때 다시 생각하면, 우리는 그것을 그릴 때, 우리는 단순히 그냥 링크를 추가했습니다. 하지만 여기 대신, 그냥 링크를 추가 당신이 그 노드의 2를 제거하고 다른 하나를 대체으로 더 생각합니다. 수확과 재배의 관점에서 그 표현하려면, 당신은이 나무를 채취 한 다음 다른 나무를 심는하고 그 말은 당신이 어린이로 나온 사람들이 나무가 있습니다. 호프만의 나무를 구축하려면 순서로 기호 및 주파수에서 읽을 수있는 Huffeader이 당신에게 그 데이터를 얻을 수 있으므로하면, 당신에게 주파수의 배열을 제공합니다. 그러니 가서 수 있으며, 단지에서 0으로 아무 것도 무시 우리는 그것의 끝에서 256 잎을 원하지 않기 때문에. 우리는 문자로되어 잎의 수를 원하는 그는 실제로 파일에 사용됩니다. 당신은 그 기호에 읽기 및 비-0 주파수를 가진 기호의 각 수 그 나무가 될 것이다. 당신이 할 수있는 것은이 아닌-0 주파수 기호를 읽을 때마다 당신은 숲의 나무를 심을 수 있습니다. 당신이 숲에서 나무를 심는 후에는 형제 자매로 그 나무를 가입 할 수 있습니다 따라서 재배 및 픽업하는 곳 따기 2 후 공장 1로 돌아 간다 어디 한 당신이 공장은 당신이 선택한이 2 어린이의 부모입니다. 그래서 최종 결과는 포리스트에서 단일 나무가 될 것입니다. 즉, 당신이 나무를 만드는 방법은 다음과 같습니다. 여기 잘못 될 수도 여러 가지가 있습니다 때문에 우리는 새로운 나무를 만들고 그런 식으로 포인터와 일 처리를 다루고 있습니다. 우리가 포인터를 처리했을 때 전에, 우리가 malloc'd 때마다 우리는 우리에게 NULL 포인터 값을 반환하지 않았는지 확인합니다 싶었어요. 따라서이 과정에서 여러 단계에서 여러 가지 경우가있을 거예요 어디에 프로그램이 실패 할 수 있습니다. 당신이하길 원하는 것은, 당신이 이러한 오류를 처리되었는지 확인하고 싶어요 그리고 사양에이 정상적으로 그것들을 처리 할 말 따라서 프로그램이 종료하는 이유를 말해 사용자에게 메시지를 인쇄 좋아 그리고 즉시 그것을 종료합니다. 이 오류 처리 작업을 수행하려면, 당신이 그것을 확인하는 것이 좋습니다 오류가있을 수 있다는 매번. 당신이 새로운 포인터를하신다고 매번 그가 성공적 있는지 확인하고 싶습니다. 우리가 새로운 포인터와 malloc을시키는 것입니다 어떻게했는지 전에, 그리고 우리는 그 포인터가 NULL인지 여부를 확인합니다. 그래서, 그렇게 단 수있는 경우가있을 거예요 하지만 가끔은 실제로 함수를 호출하는 그 함수 내에서, 그 mallocing 짓을 하나. 이 경우, 우리는 코드 내에서 기능의 일부로 살펴보면, 그들 중 일부는 부울 함수이다. 추상적 경우 우리는 foo를 호출 부울 함수가있는 경우 기본적으로, 우리는 foo를이 무슨 일을 했든지하는 외에을 얻을 수 있습니다 이 부울 함수니까, 사실 또는 false를 반환합니다 - 사실이라면 성공, false이면 않습니다. 그래서 우리는 foo는의 반환 값이 true 또는 false인지 확인하고 싶습니다. 이 거짓이라면, 우리가 어떤 종류의 메시지를 인쇄 할거야 것을 의미합니다 다음 프로그램을 종료합니다. 우리가 원하는 것은 foo는의 반환 값을 확인합니다. foo는이 false를 반환한다면, 우리는 오류의 일부 종류를 발생 알 우리는 우리의 프로그램을 종료해야합니다. 이 작업을 수행하는 방법은 실제 기능 자체가 상태 인 조건을 가지고 있습니다. foo는이 X에 소요 말해. 우리는 경우 조건으로 할 수 있습니다 (foo는 (X)). 푸 실행의 끝에가 true를 반환하면 기본적으로, 그 의미 함수가 푸 평가 있기 때문에 다음에 우리가 할 수 전체 상태를 평가하는 순서를 유지해야합니다. 그래서 그 기능이 true를 반환하고 성공하면 당신이 뭔가를 할 수있는 방법입니다. 그러나 오류 검사 때, 당신은 만 함수가 false를 반환하면 종료하고 싶습니다. 당신이 할 수있는 것은 바로 추가 할 수 있습니다 == 허위 또는 단지 앞에 쿵 추가 그리고 당신은 (! foo는) 경우가 있습니다. 그 조건의 본문 내에서, 오류 처리의 모든 것이다 이 "이 나무를 만들 수 없습니다"좋아하고 1 그런 일을 반환합니다. 그렇게되면,하지만, foo는 거짓 반환지라도입니다 - foo는이 true를 반환 해. 그런 다음 다시 푸 전화 할 필요가 없습니다. 그건 일반적인 오해에요. 이 귀하의 상태에 있었기 때문에, 그것은 이미 평가 거에요 당신은 나무 나 그런 일을 할 사용하는 경우 그래서 당신은 이미 그 결과를이 또는 식물이나 곡괭이 나 뭐. 이미 그 값이 있습니다. 이미 실행있어. 그럼 조건으로 부울 함수를 사용하는 것이 좋습니다 때문에 여부가 실제로 루프의 몸을 실행할 수 없습니다, 어쨌든 함수를 실행합니다. 마지막 단계에 대한 우리의 두 번째는 파일에 메시지를 쓰고있다. 일단 허프만 트리를 빌드 후 파일에 메시지를 작성하는 것은 매우 간단합니다. 단지 0s와 1 초를 따르 지금은 너무 간단입니다. 그리고 국제 대회에서 우리는 허프만 트리에서 0s이 왼쪽 명시 알 그리고 1 초 바로 나타냅니다. 당신은 0을 얻을 당신이 조금씩에서 읽을 그래서 경우, 때마다 당신은 1에서 읽을 때마다 다음 왼쪽 지점에 따라 거고 당신은 오른쪽 지점에 따릅. 당신은 잎이 나오기 전까지 그리고 계속 할거야 잎은 가지의 끝 부분에 될거야 때문입니다. 우리가 잎 여부를 누르 여부를 우리가 어떻게 알 수 있습니까? 우리는 전에 말했다. [학생] 포인터가 NULL 인 경우. >> 그래. 왼쪽과 오른쪽 모두 나무 포인터가 NULL 인 경우 우리가 잎에 충돌 한 경우 우리는 알 수 있습니다. 좋아요. 우리는 우리 후우 파일로 조금씩에서 읽을 할 알아요. 우리가 dump.c에서 전에 본 바와 같이, 그들이 무슨 짓을했는지들은 후우 파일에 조금씩에서 읽을 수 있습니다 불과 그 비트가 뭔지 출력한다. 우리가 그렇게 일을 할 수 없어요. 우리는 조금 더 복잡한 뭔가 일을 할거야. 하지만 우리가 할 수있는 것은 우리가 비트에 읽는 코드의 비트를 취할 수 있습니다. 여기 우리가하고 있다고 현재의 비트를 나타내는 정수 비트가 있습니다. 이 파일의 끝이 나오기 전까지이 파일에있는 비트의 모든 반복을 담당한다. 그에 따라 다음이 반복자의 일부 종류를 갖고 싶어 할거야 당신의 나무를 통과합니다. 그리고, 비트가 0 또는 1인지에 따라 여러분은 왼쪽에 그 반복자를 이동하거나 오른쪽으로 이동하려는거야 모든 방법은 잎이 나오기 전까지 때문에 모든 방법은 중이 해당 노드까지 더 이상 노드를 가리 키지 않습니다. 왜 우리는 호프만 파일하지만 모스 코드와 함께이 작업을 수행 할 수 있습니다? 모스 코드에서 모호 조금 있긴한데 때문입니다. 우리는 대기 오처럼 될 수, 우리는 길을 따라 편지를 부딪 혔어요, 그럼이 우리의 편지입니다 우리가 좀 더 계속하면, 우리는 또 다른 편지를 맞았을 텐데 반면. 하지만 그건, 허프만 인코딩 할 순 없어 그래서 우리는 우리가 갈 수있는 유일한 방법은 캐릭터를 공격 할 안심 하셔도됩니다 해당 노드의 왼쪽과 오른쪽 아이가 NULL 인 경우입니다. 마지막으로, 우리는 우리의 기억을 모두 확보하고 싶습니다. 우리는 우리가 다루고 된 것으로 모두 가까이 후우 파일에 원하는 뿐만 아니라 우리의 숲에있는 나무를 모두 제거합니다. 구현에 따라, 당신은 아마 숲을 제거 전화 할 거예요 대신 실제로 나무 자신의 모든 통과. 당신은 임시 나무를 한 경우 그러나, 당신은 그렇게 확보하는 것이 좋습니다. 당신은 최고의 코드를 알고 있으므로 메모리를 할당하는 곳을 알아. 그리고 당신이 들어가 있다면,, malloc에​​ 대한 F'ing도 제어하여 시작 보는 때마다 malloc하고 그 모두를 해방 확인하기 하지만, 그냥 코드를 겪고 당신이 메모리를 할당했을 수도있는 이해. 보통 당신은 "파일의 끝에서 난 그냥 내 숲에 숲을 제거하는거야"라고 할 수 그래서 기본적으로 무료로, 그 메모리를 지우 즉, "그리고 나는 또한 파일을 닫 후 내 프로그램이 종료 것입니다 거예요." 그러나 프로그램이 종료되는 그 유일한 시간은? 아니, 때문에 때때로 어떻게 오류가 발생했을 수 있습니다. 우리가 파일을 열 수 없습니다 또는 우리는 다른 나무를 만들 수 없습니다 또는 오류의 일부 종류의 메모리 할당 과정에서 사고 때문에 NULL 반환. 오류가 발생하고 우리는 돌아 종료합니다. 그래서 당신은 프로그램이 가능한 모든 시간 종료 할 수 있는지 확인하려면 거기 당신의 기억을 모두 확보하고 싶습니다. 그것은 당신이 코드를 종료하는 main () 함수의 맨 끝은 아닐 거예요. 당신은 당신의 코드가 잠재적으로 조기에 제공 할 수있는 모든 인스턴스에 다시보고 싶어요 그리고 무료로 어떤 메모리는 의미가있다. 당신은 숲을 만들고 그 true를 반환이라고했다 말한다. 그런 다음 당신은 아마 당신의 숲을 제거 할 필요가 없습니다 당신은 아직 숲이 없기 때문입니다. 그러나 코드의 모든 시점에서 당신은 성급하게 제공 할 수있는 당신이 가능한 모든 메모리를 확보되었는지 확인하고 싶습니다. 그래서 우리는 메모리를 자유롭게 처리하고 잠재적 인 누수가 발생하는 경우, 우리는 우리의 판단과 논리를 사용하지 만 원 뿐만 아니라 우리가 제대로 여부를 우리의 기억을 모두 해제 여부를 결정하기 위해 Valgrind 사용합니다. 당신도 퐁퐁에서 Valgrind를 실행할 수 있습니다 그리고 당신은 또한에 합격해야 명령 줄 인수의 오른쪽 숫자는 Valgrind합니다. 당신은 실행할 수 있지만, 출력이 좀 이상한 것입니다. 우리는 도전자와 함께하기 위해 사용되는 비트 수가있어하지만, 우리는 여전히 좀 더 도움이 필요합니다 그럼, 누출 확인 = 전체와 같은 몇 가지 플래그와 함께 실행 아마 우리가 우리에게 Valgrind에 좀 더 도움이 출력을 제공 할 것입니다. 그런 다음 디버깅하는 또 다른 유용한 팁은 diff 명령입니다. 당신은 후우의 직원의 구현에 액세스 실행하는 텍스트 파일에, 수 그리고 구체적으로, 이진 파일, 이진 후우 파일로 출력. 그런 다음 그 이진 파일에 자신의 퍼프를 실행하는 경우 그리고 이상적으로, 당신 출력 된 텍스트 파일은 동일한 될 것입니다 당신은 집에 전달 된 원래 하나에 난 여기 예제로 hth.txt를 사용하고 그건 당신이 사양에 대한 이야기​​ 하​​나. 그 말 그대로 그냥 HTH 한 다음 줄 바꿈입니다. 그러나 확실히 부담하면 확실히 이상 예제를 사용하는 것이 좋습니다 텍스트 파일에 대해. 당신은 압축을 푸는 아마도 압축에서 총을 쏘면 수 전쟁과 평화 등이 도전자에 사용하는 파일의 일부 나 제인 오스틴이나 그런 걸 - 멋진 일이 될 것이다 - 또는 오스틴, 우리는 그것에 큰 파일을 다루는 종류의 오지 않기 때문에 우리는 여기에서 다음 도구 LS-리터를 사용한 경우. 우리는 기본적으로 현재 디렉토리에있는 모든 내용을 나열인가요으로 사용하고 있습니다. 플래그 - 나에 합격하는 것은 실제로 그 파일의 크기를 표시합니다. 당신이 pset의 사양을 연다면, 사실은, 바이너리 파일을 만드는 과정을 안내합니다 의를 피 우니, 당신은 매우 작은 파일을 보면 을 압축하고 모든 정보를 번역의 공간 비용 그렇게 모든 주파수와 일의 실제 혜택은 넘어서 처음에 파일을 압축을. 당신이 더 이상 텍스트 파일에서 실행한다면, 그럼 당신은 당신이 이익을 얻을 시작하는 볼 수 있습니다 그 파일을 압축 인치 그리고 마지막으로, 우리는 확실히 너무 유용 할 것이다 우리의 오랜 친구의 GDB를 갖추고 있습니다. 우리는 나무를 만들기의 아마 후우 나무 나 과정에 대한 질문이 있습니까 또는 Huff'n 퍼프에 다른 질문? 좋아요. 내가 좀 주위를있을거야. 감사합니다, 여러분. 이 연습 6이었다. 그리고 행운을 빌어 요. [CS50.TV]