[Powered by Google Translate] [주 6]
[데이비드 J. Malan] [하버드 대학]
[이 CS50 수 있습니다.] [CS50.TV]
>> 이 CS50이며,이 주 6의 시작입니다
있도록 새로운 도구의 부부는 이제 활용 할 수 있습니다
그 중 첫 번째는 CS50 스타일이라고합니다.
당신이 또는 교육 친구들의 같은 경우 확률은
당신은 아마 그의 스타일과 같은 작은 선물을 보이는 프로그램을 봤어요.
, 아마 당신은 밤 늦게 일부 모서리를 절단 시작하거나 나중에 해결 하죠
그리고 TF 또는 CA는 근무 시간 중에 이상이 있습니다.
우리 읽기 그리고는 어렵습니다.
음,이 코드는 구문 올바른이며, 컴파일하고, 실제로 실행됩니다.
그러나 확실히 스타일 5 없습니다.
>> 하지만 지금은 우리가이 디렉토리에 가면 여기
내가 가지고 conditions2.c -를 발견
그리고, 입력이 파일 conditions2.c에이 새로운 명령, style50를 실행
그냥 그대로두면 양식화 된 것을 내게 알려 있다는 것을.
Gedit는 파일이 디스크에 변경되었습니다 것으로 나타났습니다
제가 새로 고침을 클릭한다면, 모든 문제는 현재 자동화되어 있습니다.
[박수]
우리가 이번 주말 짓을 한 일 중 하나입니다.
몇 가지 코드가 있기 때문에 그 불완전한 것을 실현
단순히 완벽하게 어떤 양식에 일치시키다 할 수,하지 않습니다
하지만 실현이 이제의 이점을 누리 실 수 있습니다 도구입니다
경우에만 더 잘못 될 수 있네, 비유하자면 배치 중괄호 최대 깔끔한 일부와 같은합니다.
>> 하지만 좀 더 설득력 지금은 CS50 확인합니다.
CS50 확인을 통해, 당신은 실제로 같은 정확성 검사를 수행 할 수 있습니다
교육 친구들이 할 수 있다는 자신의 코드에.
이 어플라이언스에 나왔고, 명령 줄 유틸리티입니다
최대한 빨리 당으로 update50을로
pset 4 사양이 다음과 같이 본질적를 사용합니다.
당신은 명령 check50을 실행합니다.
그런 다음 당신은 명령 줄 인수를 전달, 또는 좀 더 일반적으로 스위치 또는 깃발로 알려져 있습니다.
일반적으로 하이픈이 물건은 스위치라고합니다
명령 줄 프로그램에 따라서-C를 지정
당신이 실행하려는 확인합니다.
>> 당신이 실행하려는 테스트는 독특하게이 문자열에 의해 식별됩니다
2012/pset4/resize.
즉, 그냥 임의하지만 고유 한 문자열입니다
우리는 고유 pset 4의 정확성 검사를 식별하는 데 사용하는.
그리고 당신이 업로드 할 파일을 공백으로 구분 목록을 지정
분석을위한 CS50 확인합니다.
예를 들어, 나는 여기를 내 솔루션에 가면 resize.c -
내가 더 큰 터미널 윈도우를 열어
내가 가서 해의를 실행하는 것은 check50-C 2012/pset4/resize는 말
그리고 나는 가서 파일의 이름을 지정합니다
resize.c, 다음, 그 압축, Enter 키를 누르
가 업로드, 그것은 확인하고, 난 그냥 테스트를 왕창 실패했습니다.
왼쪽 상단 붉은 색의 하나는 resize.c와 BMP가 존재 있다고 말한다.
그 테스트했습니다. 우리가 묻는 질문이었다.
답변이 잘못했기 때문에 그리고 행복입니다.
그 아래의 흰색 텍스트가 존재하는 bmp.h 기대라고, 그 단순히 내 잘못이야.
, 내가 업로드하는 걸 잊어 버려서 내가 두 파일을 업로드 할 필요가
resize.c 및 bmp.h.
사람들이 실행되지 않았기 때문에 그러나 지금은 다른 모든 테스트 노란색에를 발견,
그는도 행복도 슬픔이기 때문에 그래서 웃는 얼굴이 수직
그러나 우리는 다른 검사를 실행하기 전에 빨간색으로 그 문제를 교정해야합니다.
>> 내가이 문제를 해결 보자.
또한 bmp.h와 함께, 제가 축소이를 다시 실행이 시간을 보자
모두가 잘되면 명령 줄에서 지금 입력하고
당신의 홀드 결과를 확인하고 반환하는거야 숨을 -
지금까지 pset 4 정말 잘하고있어 의미 모두 녹색.
여기를보고 설명 텍스트에서 추측 할 수
우리가 테스트를 정확히.
우리는 먼저 파일이 존재 테스트?
우리는 resize.c 컴파일을 수행 테스트?
그런 다음 우리는 N, 크기 조정 계수가 1 인 경우는 1x1 픽셀 BMP의 크기를 변경하지 않습니다 테스트.
당신이 N이 뭔지는 전혀 감이 없다면, 당신은 일단, pset (4) 내로 잠수합니다
하지만 그건 단순히 크​​기를 조정하지 있는지 확인하기 위해 정신 검사입니다
크기 조정 계수가 1이면 전혀 이미지입니다.
반면, 제대로 2x2로 1x1 픽셀 BMP로 1x1 픽셀 크기를 조절하는 경우
n은 2 때 다음 비슷하게, 나의 따라 형성한다.
>> 즉, 이것은 하나에 의미, 횡단 손가락을
바로 전에 방정식의 밖으로 pset를 제출합니다.
당신은 당신 TF 곧 알 수 정확히 알 수
당신은 이러한 문제 세트의 일부를 제출하는 방법을 갈 때,
또한 교육학 동기 넣어 정말
당신이 사전에 알 수 있도록 당신의 앞에있는 기회
코드에서 버그와 전달되지 않을 테스트는있을거야
당신은 그 문제를 해결하기 위해 눈 앞에 더 효과적인 시간에 넣을 수 있습니다
포인트를 잃게보다는, 당신의 TF의 의견을
그리고 그 알아 낸 것처럼 "아"를 이동합니다.
지금 적어도 당신이 그렇게을 찾는 데 도움이되는 도구가 있습니다.
그것은 버그가 어디에 지적하지 않을거야,하지만 당신을 알려줍니다
그것의 증상 일 수 있습니다.
>> 이제 시험이 반드시 철저한하지 않습니다 알고 있습니다.
당신은 녹색 웃는 얼굴 전체 화면을해서
코드가 완벽한 의미하지 않습니다,하지만 의미
이 사양에 의해 규정 특정 테스트를 통과했다고.
때때로 우리는 수표를 공개하지 않습니다.
예를 들어, 추리 소설, pset (4)의 측면 중 하나
우리는 당신에게 실망 종류의를 제공하는 경우
그게 뭘하고 공개하는 방법에는 여러가지가 아니라 답변
사람은 붉은 색 노이즈에 사람입니다.
사양은 항상 pset 5 이후의 미래에 지정합니다
당신을 위해 존재를 확인합니다 무엇.
당신은 맨 아래에있는 흰색 URL가 표시됩니다.
지금이 바로 진단 결과입니다.
해당 URL을 방문 할 경우, 당신은 미쳤어, 암호화 된 메시지의 전체 무리 가져올 게
당신은을 통해 볼 수는 있습니다하지만 직원 대부분이라고
그래서 우리는 진단하고 check50 자체에 버그를 디버깅 할 수 있는지 확인하십시오.
>> ADO없이,의 우리가 그만 둔 곳으로 이동하세요.
일부 주 동안 부여를 위해 우리가했다 CS50 도서관,
하지만 지난 주, 우리는 그것의 레이어 중 하나를 다시 필링 시작했다.
우리는 대신에 무엇을 찬성 문자열을 따로 넣어 시작?
[학생] 문자.
항상 숯불 * 된 문자 *,,
지금 우리는 실제 데이터 형식 문자열입니다 척 할 필요가 없습니다.
오히려,이, 숯불 *에 대한 종류의 동의어있었습니다
그리고 문자열은 문자의 순서입니다
그래서 왜 숯불 * S로 문자열을 표현하기 위해 이해합니까?
숯불 *는 문자열이 개념의 맥락에서 무엇을 나타 냅니까?
그래. >> [학생]의 첫 번째 문자입니다.
좋아, 첫 번째 문자는 아니지만 매우 첫 번째 문자입니다.
이-[학생] 주소입니다.
좋아, 첫 번째 문자의 주소입니다.
컴퓨터의 메모리에 문자열을 표현하기 위해 필요 모든
단지 매우 첫 번째 바이트의 고유 한 주소입니다.
당신은 얼마나 오래 알 필요는 없습니다
어떻게 동적으로 그 방법을 찾아 내야 할 수 있기 때문에?
[학생] 문자열의 길이.
당신은 문자열 길이, 훌륭한,하지만 어떻게 문자열 길이 작동합니까를 호출 할 수 있습니다?
는 무엇입니까? 그래.
[학생] 당신은 당신의 널 문자를 얻을 때까지 계속 해요.
네, 정확히, 그냥 동안 루프, 루프와 반복
*에서 끝으로 무엇이든, 끝하는 것은 표현
\ 0으로, 소위 빵점 문자 빵점,
포인터가 널 (null),과 혼동 할 수 없습니다
이는 오늘날 다시 대화에 올 것이다.
>> , 우리는 다시 GetInt의 층을 벗겨, 그리고 나서 우리는 GetString를 살펴 봤네
그리고 그 그 기능을 모두, 또는 정말 기억
GetString, 특정 기능을 사용했습니다
실제로 구문 분석,,, 사용자의 입력을 읽거나 분석하게된다.
그리고 새로운 기능은 무엇입니까?
Scanf 또는 sscanf. 사실은 몇 가지 다른 맛에 있습니다.
scanf가있어, sscanf있어, fscanf가 있습니다.
지금은하지만, 어디 하나 가장 쉽게 설명에 초점을 맞춰 보자
이 날 진행하고 어플라이언스에서 열어
이 같은 파일 scanf1.c.
이것은 슈퍼 간단한 프로그램입니다
하지만 그게 우리가 본적이 없어요 일을 수행
CS50 라이브러리의 도움없이.
이 사용자로부터 정수를 얻을 수 있습니다. 어떻게 작동합니까?
음, 행이 16,
우리가 정수라고 x를 선언하는 것을, 그리고 그 이야기의이 시점에서,
x의 값은 무엇인가?
[안 들리게 학생 응답]
[데이비드 M.]는 오른쪽, 누가 알아, 일부 쓰레기 값이 될 가능성이 있으므로 17에, 우리는 사용자에게
제발, 나에게 전화 번호를 알려하고, 지금부터가 진짜 재미있는 부분 단계 18입니다.
Scanf는 따옴표에서 이러한 형식의 코드를 사용하는 점에서 printf에서 아이디어를 빌려 보인다.
% d 개는 물론 10 진수입니다.
하지만 내가 왜 & X 대신 단지 X에서 합격 이유는 무엇입니까?
전이 정확합니다. 그래.
[안 들리게 학생 응답]
맞아요, 경우이 프로그램의 목적, 기능 GetInt 자체처럼,
사용자의 정수를 얻을 나는 기능을 전달할 수있다
모든 변수는 내가 원하는,하지만 난 참조하여 합격하지 않은 경우
또는 포인터 주소를하거나, 오늘의 목적에 대한 모든 동의어,
해당 기능은 해당 변수의 내용을 변경 할 능력이 없습니다.
이것은 단지 스왑 버그 버전의 같은 사본에 통과 것
우리는 이제 몇 번 얘기를 한.
>> 대신, 일 및 X가, 실은 무엇에 전달 돼?
[학생] 주소. x의 주소를 >>.
그것은 scanf라는 함수에 대한지도를 그리기 여기 말하는 것과 같 잖아요
이것들은 컴퓨터의 메모리 덩어리에 약도가 있어요
당신이 꼭 어떤 정수를 저장할 갈 수 있다는
위해 sscanf를 위해 지금 그렇게 할 수
어떤 연산자, 문법 어떤 부분이 사용하려고합니다
다른 사람이이 기능을 쓴 있기 때문에 우리는 그것을 볼 수없는 경우에도?
즉 - 그게 뭔데?
[학생] X 읽어보십시오.
몇 가지 읽기 수있을거야,하지만이 X에 관한있어.
scanf는 X의 주소를 전달하는 경우는,
통 사적으로, 어떤 연산자는 어딘가에 존재하는 바인딩
내부 scanf의 구현의 때문에 scanf
실제로 해당 주소로 숫자 2를 쓸 수 있나요?
그래, *.
*은 기본적으로 거기에 갈 수 있다는 우리의 역 참조 연산자, 즉 기억합니다.
>> 경우는 여기로 후에는, 주소를 넘겨 봤는데
scanf는 우리가 실제로는 원본을 둘러 보았다됩니다 아마도 경우 코드
* X 또는 실제로 그 주소로 가서, 거기서 좀 값을 넣어 동등한을 다하고 있습니다.
지금과 같은 scanf는 키보드에서 입력을 도착 방법에 대한,
우리는 오늘 우리의 손을 흔들 수 있습니다.
그냥 운영 체제가 얘기 할 sscanf 수 있다고 가정
사용자의 키보드, 지금 라인 (19)이 시점에서,
우리가 단순히 X를 인쇄 할 때, 그것은 경우 것 같다
그 scanf는 x에 정수를 넣어있다.
그게 바로 scanf가 어떻게 작동하는지, 그리고 지난 주 기억
그게 정확히 어떻게 GetString 및 GetInt와 기능의 다른 가족
궁극적으로, sscanf와 같은 약간의 변화와 함께이라도 작동
하는 대신 키보드의 문자열을 스캔을 의미합니다.
그러나가이 작은 차이를 살펴 보자.
scanf2에서, 사실은 실패 했어.
무슨 문제 - 그리고 나는 설명으로 많이를 주석들을 숨기 겠어
버전 2는이 프로그램과 함께 도대체 뭐가 문제 야?
이 시간 가능한 기술한다.
그것은 아주 잘 보입니다.
그것은 잘 들여 쓰기,하지만 -있어
좋아, 방법에 대한의는 짧은 질문에 내려 치기 까?
선 16. 정확한 그러나 기술적 인 영어로하는 선 (16)는 무엇입니까?
조금 어색한 것 뿐이야. 예, 마이클.
[학생] 그것은 문자열의 첫 글자를 가리키는있어.
>> 좋아요, 가까이. 저 조금 조정할 보자.
문자열의 첫 글자를 가리키는, 당신은라는 변수 버퍼를 확정되었습니다
즉, 문자열의 첫 번째 주소로 연결됩니다
또는 오히려, 그게 더 구체적으로 숯불로 연결됩니다.
더 할당 연산자가 없기 때문에 실제로 어느 가리 안납니다.
더 등호이 없다, 우리가하는 모든 변수 호출 버퍼를 할당집니다.
이 포인터이기 때문에 그것은 32 비트에서 일어나는
와 버퍼의 내용을 아마 결국
문자의 주소를 포함 할 것입니다하지만 지금은, 버퍼에 포함 된 무엇입니까?
그냥 가짜는 누가 알아, 일부 쓰레기 값,
우리가 명시 적으로 초기화하지 않았기 때문에, 그래서 우리는 아무 것도 가정해서는 안됩니다.
그럼 이제 라인 17 - 어떻게되어 줄 17하나요?
어쩌면 그게이 일을 따뜻하게합니다.
그것은 바로, 문자열을 인쇄?
이 문자열하시기 바랍니다 출력합니다.
>> 라인 18 우리가이 차이를 본 지금의 친숙한 종류의 것입니다
하지만 다른 형식의 코드를, 그래서 라인 18에,
우리가 여기서 scanf을 말하는지는 메모리의 청크의 주소입니다.
당신이로 % s에서 암시, 문자열에 전화 해달라고
하지만 문제는 우리가 여기서 몇 가지만하지 않은 것입니다.
문제 중 하나는 무엇입니까?
[학생] 그것은 역 참조에 null 포인터를하려고합니다.
좋아, 널 (null) 또는 기타 알 수없는 포인터.
당신은 scanf에게 주소를주고 있지만 당신은 좀 전에 말
우리가 실제로 아무것도에 할당하지 않았기 때문에 해당 주소 일부 쓰레기 값입니다
그리고 당신은 scanf를 효과적으로 여기에 문자열을 넣어 갈 건가
아직 여기 어디에 우리는 몰라
그래서 우리는 실제로 버퍼에 대한 메모리를 할당하지 않았습니다.
또한, 당신은 심지어 scanf를 말하지 않은 또 뭐야?
이 메모리의 덩어리 였고, 그, 쓰레기 값이 아닙니다 겠지
하지만 당신은 여전히​​ scanf 중요한 무언가를 이야기하지 않았 소.
[학생] 실제로 어디에, 앰퍼샌드.
앰퍼샌드,이 경우에, 괜찮아.
버퍼가 이미 포인터로 선언되어 있기 때문에
구문의 * 기사와 함께, 우리는 앰퍼샌드를 사용할 필요가 없습니다
때문에 이미 주소하지만 난 여기에 들었어 생각합니다.
[학생] 크기가 얼마나 돼요?
좋아, 우리는,이 버퍼가 얼마나 큰 scanf를 이야기하지 않았
그 때문에 버퍼 포인터이라도 의미
우리는, scanf 말을 여기에 문자열을 넣어하는
하지만 여기에 2 바이트가 될 수는 10 바이트가 될 수는 메가 바이트가 될 수 있습니다.
Scanf 아무 생각이 없다,이 메모리의 덩어리이기 때문에
아마, 아직 문자열이 아닙니다.
당신은 문자와 메모리의 청크에 \ 0을 쓸 일단은 문자열입니다.
지금은 그냥 메모리의 일부 덩어리입니다.
Scanf는 주소로 편지를 멈출 때를 알 수 없습니다.
>> 당신은 내가 무작위로 키보드에서 입력 한 과거에 몇 가지 예제를 기억하는 경우
오버 플로우 버퍼를에 노력하고, 우리는 정확히 그 얘기 금요일 했어요.
상대는 어떻게 든 여러분의 프로그램에 훨씬 더 큰 단어를 삽입하는 경우
또는 문장이나 구문 그런 다음 당신은 오버런 수 있습니다 기대했던
나쁜 결과를 가질 수 있습니다 메모리의 덩어리,
전체 프로그램 자체 인계처럼.
우리는 어떻게 든이 문제를 해결해야합니다.
나 축소하고이 프로그램의 버전 3으로 가자.
그건 조금 낫다.
이 버전에서는, 그 차이를 확인합니다.
라인 16에서, 다시,라는 변수 버퍼를 선언 했어
하지만 지금은 무엇입니까?
이 16 문자의 배열입니다.
지금 scanf 말할 수 의미하기 때문에이 좋다
여기에 메모리의 실제 덩어리입니다.
당신은 거의 지금 포인터하다고 배열을 생각할 수
실제로 동등한하지 않더라도.
그들은 서로 다른 상황에서 다르게 행동합니다.
그러나 확실히 버퍼가 참조되는 경우입니다
16 연속 문자 그게 무슨 배열되어 있기 때문에
지금 몇 주 동안있다.
>> 여기, 여기 scanf을 말해 줄려고하면 메모리의 덩어리입니다.
이번에는, 사실은 메모리의 덩어리입니다
하지만 왜이 프로그램은 여전히​​ 악용입니까?
아직 무슨 일이야?
나는 나에게 16 바이트 만 -을 제공 말했듯이
[학생] 그들이 이상 16 입력하면?
정확히 어떤 17 자 또는 1700 문자로 사용자가 형식면?
사실, 지금 우리가 실수여 여행이 아니라 가능하면 보자.
그것은 더 나은하지만, 완벽하지입니다.
내가 가서이 프로그램을 컴파일 scanf3을 실행할 수 있습니다.
안녕하세요, 우리는 괜찮을 것 같습니다 : 문자열, 제가 scanf3를 실행하십시오 보자.
저 안녕하세요, 약간 이상을 시도해 보자.
좋아요, 입력 오늘은 어떠세요, 안녕하세요 해보자.
여기 운의 종류를 얻기 시작하자 어떻게 당신이 거기에 인사.
젠장.
좋아, 그럼 우리는 운이 좋았 군. 우리가이 문제를 해결할 수없는 경우 봅시다.
아니, 나 복사 용납 할 수 없어.
가 다시 해 보자.
좋아, 대기하라.
우리는 아직이 일을하는 동안 초점을 척 시간을 볼 수 있습니다.
젠장. 그 사실은, 오히려 적절한입니다.
우리는 간다.
포인트했다.
>> 이, 이건 또한 비록 창피하게, 또한 큰 혼란의 근원 중 하나입니다
그들 자신을 되는거야 때문에 버그가 프로그램을 작성할 때
한 번만 가끔 가죠.
현실은, 심지어 코드가 완전히 깨진 경우 것입니다
그는 완전히 가끔 끊어 될 수 있습니다
때때로, 본질적으로 어떤 일이 생기하면 운영 체제를 할당하기 때문에
당신보다 조금 더 많은 메모리는 실제로 어떤 이유로 필요
그리고 다른 사람 말이 맞아, 16 자의 덩어리 후에 메모리를 사용하지 않습니다
당신은 17, 18, 19,간에, 이러한 큰 문제가 아닌가요로 이동 그렇게하십시오.
이제 컴퓨터가 그 시점에 충돌하지 않는 경우에도,
결국 다른 무언가를 바이트 17 또는 18 19 사용할 수 있습니다,
되는 것은 지나치게 긴이라도 당신이 거기 넣은 데이터를 가리
다른 함수에 의해 잠재적으로 덮어 얻을 수 있습니다.
그것은 반드시 그대로 유지하지 않을거야
하지만 반드시 감금 오류가 발생하지 않습니다.
그러나이 경우에는 드디어 충분한 문자를 제공
나는 본질적으로, 메모리 내 세​​그먼트를 초과하고, 빵 것을
운영 체제는 "죄송 해요, 더 좋은 세분화 잘못이 없다"고 말했다.
>> 그리고 내 안에 남아있는 경우 지금 보자 디렉토리 -
내가 여기 핵심이 파일이 있는지 확인합니다.
이 다시 코어 덤프라고 것을 확인할 수 있습니다.
그것은 본질적으로 프로그램의 메모리의 내용을 포함하는 파일입니다
가 추락하는 시점에서,
여기로 약간의 예를하려고 나를 여기에 보내
그리고 핵심이라는 세 번째 인수를 지정 후 scanf3에 gdb를 실행하고
여기 것을 내가 그 코드를 나열하면,
우리는이 프로그램을 통해 도보로 시작하는 gdb를 평소와 같이 할 수 있습니다
그리고 나는대로 치 등의 단계 명령을 즉시 실행 할 수 gdb를 -
나는 큰 문자열을 입력 한 후, 잠재적 인 버그가 줄을 치 자마자
사실 여기를 식별 할 수 있습니다.
더이에,하지만 핵심 덤프의 관점에서 섹션에서
그리고 실제로 코어 덤프 내부 주변 찌른 할 수 있도록 좋아
그리고 프로그램이 실패 어떤 라인에서 참조하십시오.
포인터에 및 주소에 대한 다음 질문?
에서 오늘 때문에, 우리는 이러한 일들이 존재한다는 당연한 나타나기 시작 할거야
우리는 그것들이 정확히 알지.
예.
>> [학생] 어떻게 옆에 앰퍼샌드를 뿌리지도 않았는데 올 파트
좋은 질문입니다.
어떻게 내가 이전에했던 것처럼 문자 배열 옆에 앰퍼샌드를 뿌리지도 않았는데 올
우리 예제의 대부분과?
짧은 대답은 배열이 좀 특별합니다.
당신은 거의 실제 주소로서 버퍼를 생각할 수
그리고 너무 경우로 그런 일이 일어날 대괄호 표기법
우리가 브래킷 0, 받침대 1로 이동 할 수 있도록 편의를합니다
* 기호를 사용하지 않고도 브래킷 2.
이게 바로 백인 거짓말의 일부분 때문에 배열과 포인터
사실 조금 다릅니다 만, 종종 있지만 항상 상호 교환 사용할 수 있습니다.
한마디로, 함수의 메모리 덩어리에 대한 포인터를 기다리고 때,
당신도 그것을 malloc에​​ 의해 반환 된 주소를 전달할 수 있습니다
우리는 머지 않아 다시 malloc를 볼 수 있습니다, 또는 당신은 그것을 배열의 이름을 전달할 수 있습니다.
이미이기 때문에 배열 앰퍼샌드를 할 필요가 없습니다
본질적으로 주소를 좋아해요.
한 가지 예외는 있습니다.
대괄호 그들에게 특별합니다.
>> 당신은 버퍼 옆에 앰퍼샌드를 넣어 수 있나요?
하지만 이번 케이스는 아니군요.
그래서이 코너 케이스 때문에 다시 동작하지 않을 것이다
위치 배열은 매우 실제 주소가 아닙니다.
하지만 우리는 아마 다른 예제 랑 오래 전부터으로 돌아올 거예요.
의는 여기에 문제를 해결하려고 봅시다.
우리는 배열로 알려져 얼마 동안 사용하고있는 데이터 구조를 갖추고 있습니다.
점에서 사례, 그게 우리가했던 일이야.
그러나 배열은 몇 가지 나름의​​ 매력과 단점이 있습니다.
배열은 좋은 이유는 무엇인가요?
당신이 좋아 -에게 한 가지 당신은 배열을 배열 - 좋아하는 범위는 무엇입니까?
어떻게 그들에 대한 편리거야? 눈길을 끄는 무엇입니까?
왜 우리는 처음에 소개 했죠?
그래.
[학생] 그들은 많은 양의 데이터를 저장할 수 있습니다, 그리고 전체 일을 사용할 필요가 없습니다.
당신은 섹션을 사용할 수 있습니다.
좋아, 당신은 많은 양의 데이터를 저장할 수있는 배열로,
그리고, 당신은 반드시 그것을 모두 사용할 필요가 없습니다, 그래서 당신은 overallocate 수
방법을 기대 할 일 많은이 사전에 모른다면 편리 할 수​​도 있습니다.
>> GetString는 완벽한 예입니다.
회사가 작성한 GetString는,,, 기대에 얼마나 많은 문자 아무 생각이 없습니다
저희가 연속 메모리 덩어리를 할당 할 수 있다는 사실은 좋은 것입니다.
배열은 또한 우리가 몇 주 전에 본 문제를 해결
코드가 매우 저조한 설계 무언가로 바뀔하기 시작하는 위치.
, 내가 다윗라는 학생 구조를 만든 기억
그리고 그건하지만 실제로 대안
라는 변수 이름과,​​ 내 생각 엔, 집이라는 또 다른 변수를 갖는까지,
그 이야기에 제가 다른 일을 소개하고 있기 때문에 ID라는 또 다른 변수
프로그램에 롭을 좋아 그래서 내가, 잠깐만 결정
나는 이러한 변수의 이름을 변경해야합니다.
자, 내 NAME1, ID1, house1를 호출합니다.
하자 롭의 NAME2, house2, ID2를 호출합니다.
하지만 무엇 토미 약 1 분을 기다려?
그런 다음 세 이상 변수했다.
우리는 다른 사람, 변수의 4 세트를 소개했다.
세계는 매우 빠른 속도로 혼란스러워 질수 시작
그래서 우리는 structs을 도입, 그리고이 구조체에 대한 독창적 인?
C의 구조체는 당신이 무엇을하게됩니까?
오늘은 정말 어색 있습니다.
왜? >> [안 들리게 학생 응답]
네, 특히, typedef는, 새로운 데이터 형식을 만들 수 있습니다
와 구조체, 구조체 키워드는, 당신이 캡슐화 할 수 있습니다
함께 데이터의 개념과 관련된 조각
그리고 이후 그 학생이 같은 전화하십시오.
>> 이제 우리가 모델링 할 수 있기 때문에 아주 좋았어
변수에 학생의 더 이상 종류의 개념적 일관성 개념
보다는 임의로 등등 문자열에 대해 한 ID에 대해 하나를 갖는합니다.
그들은 우리가 코드를 청소 시작 할 수 있기 때문에 배열은 괜찮습니다.
그런데이 배열의 현재 단점입니까?
당신은 무엇을 할 수없는 이유는 무엇입니까? 그래.
[학생] 당신은 얼마나 큰 알고 있습니다.
당신이 얼마나 넓은 지해야 그 고통의 친절 때문에.
당신의 그 이전 프로그래밍 경험을 알고 언어로 많은에
자바처럼, 당신은 메모리의 덩어리, 특히 배열을 요청할 수 있습니다
얼마나 큰 그렇게 말할 수있는 길이, 재산,와,이고, 그건 정말 편리하다.
C에서는 더 일반적인 배열에 나 strlen을 호출 할 수 없습니다
그 단어의 의미로 나 strlen 있기 때문에, 단지 문자열입니다
당신은이 때문에 인간 협약의 문자열의 길이를 알아낼 수
\ 0 있지만, 배열을 갖는의 더 총칭, 단지 메모리의 덩어리입니다.
이 ints의 배열이라면, 일부 특수 문자가있을 않을거야
끝에서 당신을 기다리고 있습니다.
당신은 배열의 길이를 기억해야합니다.
배열의 또 다른 단점은 그 자체를 GetString에 머리를 쳐.
배열의 또 다른 단점은 무엇입니까?
선생님, 당신과 나 오늘.
[안 들리게 학생 응답] >>은 뭐?
그것은 스택에 선언있어.
좋아요, 스택에 선언했다. 왜 그렇게 맘에 안들어?
[학생] 그것은 재사용됩니다 때문입니다.
이 재사용됩니다.
좋아, 메모리를 할당 할 배열을 사용하는 경우는,
이 스택에이기 때문에 당신은 예를 들어, 그것을 반환 할 수 없습니다.
그래, 그건 단점입니다.
그리고 어떻게 배열과 다른 사람에 대한?
당신이 그것을 할당되면, 당신은 더 많은 공간이 필요하면 가지 끝장 났어
그 배열이보다.
>> 그런 다음 우리는 우리에게 동적으로 메모리를 할당 할 수있는 능력을 준 리콜, malloc을 발표했다.
하지만 우리는 모두 다른 세계를 어떻게하려고한다면?
우리는 이러한 문제의 몇를 해결하기 위해 원하는 경우
그래서 우리는 대신, 내 펜은 여기 잠든있다
우리가 대신 기본적으로 다음과 같이 더 이상없는 세상을 만들기를 원한다면?
이 배열이며, 물론, 이런 종류의, 우리가 배열의 끝을 누르 악화
그리고 지금은 더 이상 다른 정수 또는 다른 문자에 대한 공간이 없습니다.
우리는 종류의 preemptively 잘라고한다면, 왜 우리는 휴식을하지 않습니다 무엇입니까
메모리의 모든 덩어리는 백업으로 돌아 가기 인접 것이 이러한 요구 사항
그리고 왜 정수 또는 문자를 필요로 할 때, 안 그래요,
단지 그들 중 하나에 저에게 공간을주지?
그리고 또 다른 필요로 할 때, 나에게 또 다른 공간을 제공
내가 다른 필요로 할 때, 다른 공간을 제공합니다.
의 장점은 이제 경우 다른 사람입니다
여기에 메모리, 더 큰 거래를 걸립니다.
여기 그리고 이번 메모리의 추가 덩어리를합니다.
>> 자, 여기 만 캐치는 내가 가지고있는 것처럼이 일이 거의 느낌이다
다른 변수의 전체 무리.
이 기능은 다섯 가지 변수 인 것 같아요.
그러나 우리는 문자열에서 무슨 생각을 훔치는 경우
내가이 짓을하면된다 우리는 어떻게 든 개념적 함께 이런 일을 연결, 그 다음엔?
이건 내 매우 저조한 그린 화살표입니다.
그러나 가정 기억의이 덩어리의 각
다른 점을 지적하고,이 사람이, 누가 자신의 오른쪽에 아무런 형제 자매가 없다,
이러한 화살표가 없습니다.
이 연결리스트라는 것을 사실입니다.
이것은 우리의 메모리 덩어리를 할당 할 수있는 새로운 데이터 구조입니다
그리고 또 다른 한 다음 다른 다음, 다른 모든 시간은 우리가 원하는
프로그램 동안, 우리는 그들 모두를 어떻게 든 관련있어 기억
말 그대로 체인으로 같이, 우리는 pictorially 여기에 화살표가있는 것으로 했어요.
그러나 코드에서, 어떻게, 당신은 어떻게 든 연결할 수있는을 통해 메커니즘 것
거의 스크래치 같은, 다른 덩어리 한 덩어리?
우리는 포인터를 마우스 오른쪽 사용할 수 있습니다?
때문에 왼쪽 상단 광장에서 무슨 일 정말 화살표
이 하나 여기이 사람은,이 광장의 안에 포함되어있을 수
그냥 어떤 ints, 그냥 숯불하지,하지만 실제로 할당 된 경우 어떤
그 그래서 지금 약간의 여분의 공간,
이 날 대가를 치르게 될 경우에도 메모리 내 덩어리의 각,
이제 좀 더 직사각형 모양있는 ​​메모리의 덩어리 중 하나
숫자에 사용되며, 숫자 1과 같은,
그리고이 사람은, 숫자 2를 저장하는 경우
메모리의 다른 청크가, 화살에 사용됩니다
이상 구체적으로, 포인터.
그리고,이 그 사람에 가리 키도록 사용하는 동안 나는 여기에 숫자 3을 저장합니다 가정
지금이 사람은, 어디 내가 메모리 만 세 등 덩어리가 필요하다고 가정하자.
I는 null를 나타내는 그 줄을 그릴 수 있습니다.
추가 문자가 없습니다.
>> 사실, 우리가 구현에 대해 갈 수있는 방법입니다
연결된 목록이라는 것을.
연결리스트는 새로운 데이터 구조이며, 대한 디딤돌입니다
문제를 해결하기 위해 시작 많은 애호가 데이터 구조
페이스 북 형 문제의 라인 및 Google 형 문제 함께
당신은 거대한 데이터 세트를 가지고 있고, 그걸 잘라하지 않습니다 곳
contiguously 모든 저장하고 선형 검색과 같은 무언가를 사용하는
이진 검색과 같은 또는 무언가.
당신이 더 실행 시간을 싶습니다.
사실, 성령 생물체 중 하나는 나중에 이번 주 또는 다음에 대해 얘기하자
그의 실행 시간 일정 알고리즘입니다.
즉, 항상 같은 시간에 상관없이 소요
입력은, 그 참, 매력적인 것 얼마나 큰
이상도 로그 무언가보다.
여기가 화면에 무엇입니까?
사각형의 각 난 그냥 손으로 그린​​ 그대로입니다.
그러나 왼쪽에있는 모든 방법 것은 특별한 변수입니다.
때문에 하나 잡았다는 하나의 포인터 될거야
연결된 목록과, 이것들은 호출로하면,
이 연결리스트의 한쪽 끝을에 끊지해야한다는 것입니다.
>> 그냥 문자열에서와 마찬가지로, 당신은 첫 번째 문자의 주소를 알고 있습니다.
링크 된 목록에 같은 거래.
당신은 메모리의 첫 번째 청크의 주소를 알고 있어야
거기서 있기 때문에, 당신은 다른 모든 하나를 도달 할 수 있습니다.
단점.
우리는 동적를 갖는이 기능성에 대해 어떤 가격을 지불
상당한 데이터 구조 우리가 어느 더 많은 메모리가 필요하다면, 괜찮아요,
한 번만 더 큰 덩어리를 할당하고 포인터를 내다
목록의 새로운 꼬리에 나이는?
그래.
[학생]은 약 두 배 많은 공간이 소요됩니다.
확실히 단점 인 것, 두 배 많은 공간을 차지하며 우리는이를 봤어요
시간과 공간과 유연성 사이의 전 효율이 줄어
지금까지, 우리는이 숫자의 각 32 비트 필요가 없습니다 곳.
우리는 정말 포인터 64, 번호 32 및 32가 필요합니다.
하지만 제겐 RAM의 2 기가 바이트 있습니다.
여기와 여기에 또 다른 32 비트를 추가하면 거래의 큰 것 같습니다하지 않습니다.
그러나 큰 데이터 세트에 대해, 확실히 그대로 두 배는 더까지 추가합니다.
이제 어떻게 또 다른 단점이야, 아니면, 우리가 어떤 기능을 포기합니까
우리는 연결리스트가 아닌 배열과 일의 목록을 나타냅니다? 경우
[학생] 당신은 거꾸로을 통과 할 수 없습니다.
당신은 거꾸로을 통과 할 수 없습니다, 당신이 걷는 경우 가지 망 너무
왼쪽에서 오른쪽으로 루프 또는 동안 루프에 대한을 사용하는
그리고 당신은 "아, 목록의 처음으로 돌아 가고 싶어요."실현
화살표가 표시 한대로이 포인터는 왼쪽에서 오른쪽으로 갈 수 때문입니다.
>> 지금, 당신은 다른 변수 목록의 시작을 기억할 수
하지만 그건 염두에 두어야하는 복잡성입니다.
배열은, 당신이 가서 얼마나 멀리 상관없이, 당신은 항상 마이너스 마이너스, 마이너스하지, 마이너스 수
당신이 생겨난 돌아갑니다.
또 다른 단점은 뭐죠? 그래.
[안 들리게 학생 질문]
당신은 그래서 당신은 실제로, 이중 연결리스트라는 데이터 구조를 제안 텐데
그리고 실제로,이 사각형의 각에 다른 포인터를 추가
다른 방향을가는, 거꾸로 중
당신이 앞뒤로 탐색 할 수 있습니다 지금
우리 예전처럼의 단점은 지금은 많은 메모리로 세 번 사용하고 있습니다
그리고 또한 바로를 얻을 작성해야하는 코드의 관점에서 복잡성을 추가 할 수도 있습니다.
반전이 더 중요한 경우 그러나 이것들은 모든 아마 매우 합리적인 tradeoffs 있습니다.
그래.
[학생] 당신은 또한 2D 연결 목록을 가질 수 없습니다.
좋아, 당신은 정말 2D 연결리스트를 가질 수 없습니다.
당신은 수. 이 배열만큼 쉬운 일이 아닙니다.
배열처럼, 오픈 브래킷, 폐쇄 브래킷, 오픈 브래킷 브래킷을 닫았을 할
그리고 다른 2 차원 구조를.
당신은 2 차원 연결리스트를 구현 할 수
당신은 추가 등 이런 것들을 각 셋째 포인터를 제안한다면
당신이 다른 목록에 대해 생각한다면 당신 3D 스타일을 올
화면에서 우리 모두에게, 어떤은 어떤 종류의 또 다른 체인입니다.
우리가 할 수 있지만, 오픈 브래킷, 대괄호를 입력처럼 단순한 게 아닙니다. 그래.
[안 들리게 학생 질문]
좋아요, 그럼이 재미있는 것입니다.
>> 우리가 이진 검색, 오 같은 이상 pined 한 이러한 알고리즘,
당신은 보드에 숫자의 배열을 검색 할 수 있습니다
또는 전화 번호부가 너무 빨리 사용하는 경우 분할 및 정복
그리고 이진 검색 알고리즘,하지만 이진 검색은 두 가정을 필요합니다.
데이터가 정렬되었는지 하나.
이제, 우리는 아마도,이 정렬 유지할 수
아마 그 문제 아니지만, 이진 검색은 가정
당신은 번호의 목록에 랜덤 액세스가 있다는
와 배열은, 당신이 랜덤 액세스를 할 수 있으며, 랜덤 액세스하여
난 당신이 배열을 제공하는 경우, 그것이 당신이 얼마나 많은 시간이 걸립니까 의미
브래킷 0 말야?
하나의 작업으로, 당신은 단지 [0] 사용하고 거기하고 있습니다.
위치 10까지 도착하는 데 얼마나 많은 단계가 걸리나요?
한 단계는, 당신은 당신이 거기있는 걸 [10]로 이동합니다.
대조적으로, 어떻게 연결된 목록에서 10 정수로 어떻게해야합니까?
만 기억 때문에 당신은 처음부터 시작해야
단지 문자열과 같은 연결리스트의 시작 부분은 기억하고 있습니다
첫 번째 문자의 주소에 의해, 그 열째 INT를 찾을 수
또는 문자열에서 해당 문자 열째, 당신은 모든 빌어 먹을 것을 검색 할 수 있습니다.
>> 다시 말하지만, 우리는 우리의 모든 문제를 해결하지.
우리는 새로운 사람을 소개하고 있지만 정말 당신이 설계하려는 일에 따라 달라집니다.
이 구현의 측면에서, 우리는 그 학생의 구조에서 아이디어를 대여하실 수 있습니다.
구문은 현재를 제외하고 매우 비슷 아이디어는 조금 더 추상적입니다
보다 집 이름과 ID.
하지만 우리가 C에서 데이터 구조를 가질 수 있다는 제안
노드라고 그, 슬라이드의 마지막 단어가 제시 등
노드의 내부, 그리고 노드는 컴퓨터 과학 일반 컨테이너입니다.
그것은 일반적으로 원이나 우리가 한로 광장 또는 사각형으로 그려있어.
그리고이 데이터 구조에, 우리는 정수, N을 가지고
그래서 내가 저장할 수 있습니다.
그러나 두 번째 줄, 구조체 노드가 * 다음은 무엇인가?
왜이 정확한지 확인하거나 역할은이 일을 플레이 무엇을
그것은 먼저 눈에 약간 이상한이지만?
그래.
[안 들리게 학생 응답]
맞아요, 그래서 일종의 포인터 부패의 * 정렬 없잖아.
이 포인터의 이름은 임의로 옆에 있습니다
우리는 그것을 우리가 원하는 건 다 신고 할 수도 있지만이 포인터 지점은 무엇을 할 수 있습니까?
[학생] 또 다른 노드가. >> 그건 정확히 같은 또 다른 노드로 가리 킵니다.
>> 자, 여기 C.의 호기심의 일종입니다
, C는 왼쪽에서 오른쪽으로, 아래로 컴파일러 상단에서 읽을 것을 기억
-이 경우 우리가 학생들과 무슨 짓을했는지 약간 다릅니다 어느 의미합니다.
우리는 학생을 정의 할 때, 우리는 실제로이 단어를 넣지 않았다.
단지 typedef 말했다.
그럼 우리가 INT ID, 문자열 이름, 문자열 하우스를했다
다음 구조체의 맨 아래에있는 학생.
이 선언이 조금 다르기 때문에,
다시 C 컴파일러는 약간 바보입니다.
단지, 위에서 아래로 읽을거야
여기 2 호선에 도달하므로 경우
다음은 선언하고보고되는​​ 오, 여기 다음이라는 변수입니다.
이 구조체 노드에 대한 포인터입니다.
컴파일러는 구조체 노드 무엇인지 깨닫게거야?
나는 전에이 일을 한 번도 들어 본 적이 없어요
단어 노드는 달리 표시하지 않을 수 있기 때문에
맨 아래까지,이 중복성이 있습니다.
당신이 나중에에서 단축 할 수있는, 여기를 구조체 노드를 얘기해야
여기 typedef 덕분에 있지만,이 때문
우리는 내부 구조의 구조 자체를 참조하고 있습니다.
거기있는 한 잡았다입니다.
>> 일부 흥미로운 문제가 발생하는 것입니다.
우리는 숫자의 목록이 있어요. 우리는에 어떻게 삽입합니까?
우리가 어떻게 그것을 어떻게 검색합니까? 우리는에서 어떻게 삭제합니까?
특히 지금 우리가이 포인터를 관리해야한다는.
당신은 포인터가 정신 벤딩의 일종이라고 생각
당신이했을 때 그 중 하나가 여기에 정수를 읽는.
이제 우리는 전체 목록의 가치를 조작해야합니다.
왜 우리가 여기 5 분 휴식을 취하지 않으며, 다음에 우리가 가지고 갈 게요
무대에 일부 사람들은 정확히 할 수 있습니다.
>> C 그것이 밖으로 행동있어 훨씬 더 재미있을 것입니다.
누구는 말 그대로 처음 하시겠습니까?
자, 어서 올라 와요. 먼저입니다.
누구는 9 삭제 하시겠습니까? 좋아요, 9.
어떻게 구 요? 17?
여기 좀 도당. 그 앞 행의 22 26.
그리고 사람을 거기에서 얼마나 지적된다.
당신이 34입니다. 알았어,에 34, 있습니다.
우선은 저기 있어요. 그래, 너희 모두 넷.
그리고 우리가 9 누구인지 말 했어요?
우리 구가 누구야?
누가 정말 구가되기를 원하는가? 좋아, 9 할에 있습니다.
여기 우리는 간다.
34, 우리는 거기서 만나자.
첫 번째 부분은 자신이 그렇게 보이게됩니다.
26, 22, 17, 좋아.
우리가 순간에서 당신을 malloc 할거야 때문에 당신이 옆에 서있다 할 수 있습니다.
>> 좋아, 좋아.
좋아요, 우수한 있으니, 여기에 몇 가지 질문을 보자.
그리고 사실, 이름이 뭐야? >> 애니타.
아니타, 그래, 어서와.
아니타는 우리가 약간 먼저 하나가 매우 간단한 질문을 해결하는 데 도움 것입니다
이것은 어떻게 값이 목록에 있는지 여부를 찾을 수 있습니까입니까?
자, 먼저 여기 루카스으로 표현하는 것을
조금 다른, 그래서 종이 그의 조각은 의도적으로 옆입니다
상당히으로 크지 않아 많은 비트로 차지하지 않기 때문에
비록 기술적으로 그는 단지 회전 용지의 같은 크기가 있습니다.
그러나 그는 포인터 만 32 비트, 그게은 조금 다릅니다
그리고이 사람들이 모든 포인터 이분의 일있는 번호입니다 이분의 일 중 64 비트,입니다.
그러나 포인터는, 그래서 묘사되지 않은 너희들이 수 다소 어색 경우
당신 옆에있는 사람에 가리 키도록 왼손을 사용합니다.
그리고 당신은 34이야. 이름이 무엇입니까?
아리.
아리, 그래서 사실은, 오른쪽 손으로 종이를 보유하고 왼손은 똑바로 내려갑니다.
당신은 왼쪽에있는 null을 나타냅니다.
>> 지금 우리 인간의 그림은 매우 일치합니다.
이 포인터는 어떻게 작동하는지 실제로 있습니다.
그리고 방법은 아니야 있도록 조금 이런 식으로 오독 오독 깨물다 할 수 있습니다.
여기 아니타, 저에게 22 번을 찾아
하지만 인간이 종이 조각을 들고 않는 제약을 가정,
하지만이 목록이며, 만 루카스가로 시작해야
그는 말 그대로 첫 번째 포인터이기 때문이다.
당신은 자신이 포인터이며, 따라서 너무 무언가를 가리 할 수​​있는 능력을 가지고 있다고 가정 해 보겠습니다.
왜 루카스가에서 가리키는 정확히 겨누고부터 시작해 볼까요?
좋아,이 날 여기에이 일을 제정 보자.
그냥 토론을 위해서, 제가 여기에 빈 페이지를 하세.
어떻게 당신의 이름을 철자합니까? >> 애니타.
좋아요, 애니타.
하자 노드 * 아니타 = 루카스를 말한다.
음, 우리는 당신 루카스 전화 안됩니다. 우리는 먼저 전화를해야합니다.
왜 여기 현실과 일치 사실입니까?
하나는 먼저 이미 존재합니다.
첫째는 어딘가 여기에 아마 할당되었습니다.
노드는 * 우선, 그리고 그것은 어떻게 든 목록을 배정하고있어.
그런 일이 어떻게 일어난 건지 모르겠어요. 수업이 시작되기 전에 그런 일이 일어날.
인간의이 연결 목록이 생성되었습니다.
그리고 지금 이야기 -이 다들 페이스 북이 벌어지고있는이 시점에서 나중에 -
이야기의 시점에서 아니타는 첫 번째 같도록 초기화되었습니다
이는 루카스의 아니타 점을 의미하지는 않습니다.
오히려, 그녀는 그가에서 지적하는 일에 지적
때문에 루카스의 32 비트의 안에 동일한 주소 - 1, 2, 3 -
1, 2, 3 - 또한 현재 내부 아니타의 32 비트입니다.
>> 지금 22를 찾으십시오. 어떻게이 일을 어떻게해야합니까?
무엇이든에 그? >> 포인트는 무엇입니까.
무엇이든을 가리 킵니다, 그래서 가서 여기 최대한으로 연기.
좋아, 좋아, 지금 당신은 포인팅하는에 - 당신의 이름이 22이야?
라몬. >> 라몬, 라몬 22까지 개최 될 수 있도록.
이제 수표을 다하고 있습니다.
만약 그렇다면 라몬 == 22 그리고 예를 들어, 우리는 진정한 돌아갈 수 않습니다.
- 날 동안하자 놈들이 어색 - 다소 여기 서
찾아 나 BOOL처럼 빠르게 무언가를 해봅시다.
나는 (노드 * 목록, INT n)이 가서 말거야.
당신이 사람들과 함께 곧 돌아 올게요. 난 그냥 몇 가지 코드를 작성해야합니다.
그리고 이제 가서이, 노드 * 아니타 = 목록을 할거야.
그리고 가서 인사하고 올게요 동안 (아니타! = NULL).
>> 여기에 비유가 좀 늘어지고 있지만, (아니타! = NULL), 내가 뭘 원하는거야 동안?
나는 참조의 일부 방법이 필요합니다
아니타가 가리키고되는 정수.
과거에는, 우리는 노드가있는 구조를했을 때,
우리는 점 표기법을 사용하고, 우리가 뭔가 이렇게 말할 것입니다
여기 anita.n하지만, 문제는 아니타는 구조체 이라기보다는되지 않는 것입니다.
그녀는 무엇인가요?
우리가이 점을 사용하려는 경우 그녀는, 그래서 정말 포인터입니다 표기법을
이 일부러 좀 봐 것입니다 암호화 -
우리가 어떤 아니타의 왼쪽으로 이동과 같은 작업을 수행 할 일은에서 가리키고
그리고 다음에 n이라는 필드를 얻을.
아니타는 포인터이지만, * 아니타는 무엇인가?
당신은 아니타가에서 가리키고 있는지에 갈 때 무엇을 찾을 수 있습니까?
구조체, 노드와 노드, 리콜, N라는 필드가 있습니다
가, 기억했기 때문에,이 두 분야, 다음과 n,
우리는 바로 여기 좀 전에 본 적이.
>> 사실, 코드에서이 작업을 모방하려면
우리는이 작업을 수행하고 말할 수있는 경우 ((* 아니타). N == n)이, 내가 찾는 그 N.
함수가 내 관심 숫자에서 통과 된 것을 확인할 수 있습니다.
그럼 내가 TRUE를 반환과 같이 가서 할 수 있습니다.
그런 경우가 아니라면 다른, 내가 뭘할까요?
어떻게 아니타가 목록을 도보로 매우 직관적으로 무슨 짓을했는지 코드를로 번역해야합니까?
나는 아니타는 왼쪽으로, 왼쪽에 해당 단계를 그 단계를 복용 시뮬레이션 여기서 뭘를해야합니까?
[안 들리게 학생 응답] >> 그게 뭐야?
[안 들리게 학생 응답]
아닌 나쁜 생각하지만, 과거에, 우리는 이런 짓을했을 때, 우리는 좋은 한 아니타 + +
그 아니타에 숫자 1을 추가하기 때문에하면,
어떤 일반적으로, 라몬처럼, 다음 사람에 지정 것
또는 그 옆에있는 사람, 또는 사람 아래로 선을 그에게 다음.
무슨 일이 메모리에 같이 않기 때문에 그러나 여기에 큰 좋지 않아?
그건 아니에요. 우리는 그렇게하지 ​​않도록해야합니다.
내가 1, 2, 3 가까이 서로를 그려 했는데도 메모리에 같이 표시하고,
우리가 시뮬레이션하는 경우에도 같은 사람들을 가리키는 동안은 사람들이 - 수
당신의 일부가 임의의 단계를 다시 앞으로 여러분 중 일부는 임의의 단계를 취할 수 있겠어요?
>> 이 혼란은 여전히​​ 연결된 목록입니다
하지만이 사람들은 어디서든 메모리에있을 수
그래서 아니타는 + + 왜 안 먹힌다?
위치 아니타에 무엇 + +?
누가 알 겠어.
그건 아주 interposed 할 일이 몇 가지 다른 값입니다
혹시 이러한 노드의 사이에 있기 때문에 우리는 배열을 사용하지 않는 것입니다.
우리는 개별적으로 이러한 노드 각각 할당.
그래, 당신들은 몸을 다시 청소 할 수 있습니다.
나를 대신 아니타 + +, 우리가 대신 할 아니타의 것을 제안하자 도착 -
그래, 우리가 할 후 아니타가에서 가리키는대로로 이동되지 않는 이유. 다음?
즉, 우리는 22 번을 들고 라몬로 이동
아니타가 왼쪽 포인터를 복사 될 것처럼하고. 다음입니다.
우리가 22 버렸기 때문에 그녀는 라몬보다 더 안 것입니다.
하지만 그건 생각합니다. 자,이는 지독한 엉망입니다.
솔직히, 아무도, 그래서 고맙게도이 구문을 기억하지, 그리고 것입니다
실제로 약간의 고의적 - 오, 실제로 제가 쓴 건 못 봤어요입니다.
당신은 할수있을 경우 더 강력한 것입니다. 짜잔!
>> 무대 뒤에서, 문제가 이런 식으로 해결했습니다.
아니타, 왼쪽이 단계를 위해,
첫째, 우리는 아니타가 가리키고되는 주소로가는거야
, 어디 그녀는뿐만 아니라 우리가 비교를 위해서 검사 n을, 찾을 수
뿐만 아니라 옆에 찾을 수 있습니다 -이 경우,
라몬의 왼쪽 손이 목록에있는 다음 노드를 가리키는.
하지만 지금은, 내가 전에 언급하는 지독한 엉망이야
C 우리가이 일을 단순화 할 수 밖에하지만집니다.
대신 작문 (* 아니타), 우리는 대신, 아니타 -> N을 작성할 수 있습니다
그리고, 그것은 기능적으로 동일한 일이야,하지만 더 많은 직관적
그리고 우리가 그리는 된 것으로 사진이 더 많은 일치
이 시간은 화살표를 사용합니다.
>> 마지막으로, 우리는이 프로그램의 끝 부분에 어떻게해야하나요?
남은 코드 한 줄이 있어요.
무엇을 반환?
거짓 때문에 우리는 전체를한다면 동안 루프
그리고 아니타 사실은 널 (null)는, 그녀가 목록의 끝까지 갔어요 의미입니다
그녀가 가리키고있는 곳에서 - 이름이 뭐였지?
null입니다 아리. >> 아리의 왼쪽.
아니타는 이제 null입니다, 그리고 당신이 지금 지옥의 변방에 어색 여기 서 실현
여기 독백이 떨어져 갈거야 때문에,
하지만 우리는 곧 다시 포함됩니다.
아니타는 이야기 그 시점에서 null입니다, 동안 루프가 종료 때문에
우리는 False를 반환하는 이유로 그녀는 아리의 NULL 포인터에 대한 모든 방법을 강구하는 경우
그리고 그녀가 목록에 추구한다는 수는 없었습니다.
우리는 너무 치울 수 있지만,이는 아주 좋은 구현 한 것입니다
탐색 기능,이 연결 목록 기능을 찾으십시오.
아직 선형 검색이야,하지만 + + 포인터처럼 간단하지
또는 + + 전 변수 이제 우리가 추측 할 수 없기 때문에
이러한 노드의 각 메모리에 위치합니다.
좀 더 구체적으로, 문자 그대로 빵 부스러기의 흔적을 따라해야하거나
한 노드에서 다른에 도착 포인터.
>> 지금의이 다른 하나를 시도해 보자. 아니타, 당신은 여기 다시 올 하시겠습니까?
왜 우리가 가서 관객의 다른 사람을 할당해야합니까?
Malloc - 당신의 이름은? >> 레베카.
레베카. 레베카는 관객의 malloced되었습니다
그녀는 이제 55 번을 저장합니다.
아니타 삽입 및 손의 목표는 지금
그 적절한 장소에 여기 링크 된 목록에 레베카.
잠시 이리와.
이런 식으로 무슨 짓을했습니다.
나는 노드 *을 다하고 있습니다. 그리고 자네 이름이 뭐였더라?
레베카. >> 레베카, 좋아.
레베카는 malloc (sizeof (노드))됩니다.
것처럼 우리는 과거에 학생들과 이것 저것 등을 할당 한
우리는 노드의 크기를해야합니다, 이제 레베카는
무엇을 가리키고 무엇입니까?
레베카 55입니다 중 하나 그녀의 내부에 두 개의 필드를 가지고 있습니다.
하자의 일, 레베카 -> = 55.
하지만 레베카 -> 옆에있는 지금 - 좋아한다, 그녀의 손을 누가 알 일 일까?
정말 이유를 잘 측정하지, 일부 쓰레기 값에서 눈치입니다
왼쪽 이제 그녀의 옆에이되도록 우리는 적어도이 작업을 수행합니다.
지금 아니타는 여기에서보십시오.
당신은 레베카가 할당 된 것으로되어 있습니다.
가서 우리가 레베카를 넣어 위치를 찾습니다.
아주 좋아, 좋아.
, 좋아, 좋아, 이제 우리는 당신이 방향의 비트를 제공해야
그래서 당신은 아리에 도달했습니다.
, 그의 왼손은 널 (null)이지만, 레베카는 분명히 오른쪽에 속한
그럼 우리는이 연결 목록을 변경해야합니까
적절한 장소에 레베카를 삽입하는 순서로?
당신은 말 그대로 필요에 따라 주변 사람들의 왼쪽 손을 움직일 수있는 경우는,
우리는 그런 식으로 문제를 해결합니다.
그래, 좋아, 그리고 한편, 레베카의 왼쪽 손은 그녀의 옆에 지금 있습니다.
>> 너무 쉬웠다.
하자, 거의 다 할당 - 우린 20 해보십시오.
자, 어서 올라 와요.
20 할당 된, 그럼 내가 가서 여기에 다시 말하죠
우리는 노드 *의 사드 했어.
우리는 (sizeof (노드)) malloc 있습니다.
우리는, 우리가 20 전에했던 것과 같은 정확한 구문을 수행
그리고 난 다음에 = NULL을 다하겠습니다, 지금은 아니타에게 달려 있습니다
당신이 동일한 역할을 할 수 있다면 당신은 연결리스트에 삽입합니다.
실행.
그래, 좋아.
당신이 근처에 왼쪽 손을 움직이기 시작하기 전에 지금 신중하게 생각합니다.
귀하는 오늘 현재까지 가장 어색한 역할을 가지고.
누구의 손 첫째 이동해야 하는가?
좋아요, 좀 더의를 듣고 있어요, 잠깐만 요.
일부 사람들은 정중하게 여기 어색한 상황을 해결하는 데 도움이하고 싶은 경우.
누구의 왼쪽 먼저 아마도 업데이트해야합니다? 그래.
[학생] 사드의.
좋아요, 사드의, 왜,하지만?
[안 들리게 학생 응답]
좋아, 때문에 우리가 이동 - 만약 당신 이름은? >> 마샬.
마샬, 우리는 null로 첫번째 다운 손을 이동하면,
이제 우리는 말 그대로이 목록에 4 명을 고아했습니다
그는 라몬과 왼쪽 모두에서 가리키는 유일한 때문
그래서 먼저 포인터를 업데이트하는 것은 좋지 않습니다.
씨가 실행 취소 보자.
좋아, 지금 가서 라몬에서 가리키는 적절한 왼쪽 손을 이동합니다.
이 약간 중복을 느낀다.
자, 그럼 이제 라몬에서 가리키는 두 사람이지만, 그 좋아요
때문에 지금은 어떻게 다른 우리는 목록을 업데이트하려면 어떻게해야합니까?
다른 어떤 손이 이동나요?
훌륭해, 지금 우리는 모든 기억을 잃은 있나요?
아니, 잘, 우리가이 한번 더 부러 할 수없는 경우 보자.
>> , 숫자 5를 마지막으로 Mallocing.
다시의 모든 방법은 아래에 있습니다.
매우 흥분 돼.
[박수]
이름이 무엇입니까? >> 론.
론은, 좋아, 당신은 5 번으로 malloced 수 있습니다.
우리는이 거의 똑같아요 해당 코드를 실행 한
그냥 다른 이름으로.
좋아요.
지금, 아니타, 행운을 빌어 요 이제 목록에 5 번을 삽입.
좋은, 그리고?
우수,이 정말 총 세 명의 가지 경우 세 번째입니다.
우리가 처음 레베카 끝에서 사람을했다.
우리는 중간에 사람을했다.
이제 우리는, 처음에,이 예제에서 사람이
우리는 이제 처음으로 루카스를 업데이트했습니다
목록의 첫 번째 요소는 이제 새 노드에 가리 있기 때문에하면,
누가, 차례로, 노드 번호 9시 가리키고 있습니다.
>> 이 상당히 어색 시연했습니다 확신 해요,
그래서 애들에게 환호와 갈채가 잖아요.
잘 했어.
그게 전부 야. 당신은 약간의 메모리로 종이의 조각을 유지 할 수 있습니다.
이 코드에서 이런 짓을 것이 밝혀
단지 주변에 손을 이동과 같은 매우 간단하지 않습니다
그리고 다른 일에 포인터를 가리키고.
하지만 이런 일을 수행 할 시간이되면 걸 깨닫게
당신이 정말로에 초점을 경우 연결된 목록 또는 그 변종
이러한 기본적인 기초, 내가 찾아 내야 할 한입 크기의 문제,
이렇게 손이나 손, 어떤 달리 상당히 복잡한 프로그램 걸 깨닫게
사실,이 같은 매우 간단한 빌딩 블록을 줄일 수 있습니다.
>> 아직도 더 정교한 방향으로 일을 살펴 보자.
이제 우리는 연결리스트의 개념을 가지고있어.
다시 제안이 있는데 이중 연결리스트에 우리는 또한이 - 감사합니다,
이는 거의 같은 소리를 들으며, 지금 우리는 구조체에 두 개의 포인터를 가지고
대신에 하나, 우리는 아마도 그 포인터가 이전 및 다음 호출 할 수
왼쪽 또는 오른쪽으로하지만, 저희는 사실, 그 중 두 필요는 없어.
코드는 좀 더 관여 할 것입니다.
아니타는 무대에 여기에서 더 많은 작업을해야 할 일을했을 것이다.
그러나 우리는 확실히 구조의 종류를 구현할 수 있습니다.
시간을 실행의 측면에서하지만, 어떻게 실행 시간 것
지금 연결 목록에서 숫자 n을 찾는 아니타은?
n의 아직도 큰 O는, 그래서 선형 검색보다 더 좋은 없어요.
우리는 다시하지만 이진 검색을 수행 할 수 없습니다.
경우 그건 이유는 무엇입니까? 당신은 주변에 점프 할 수 없습니다.
우리는 분명 무대에있는 모든 인간을 참조하더라도
와 아니타는 "다음은 그 목록의 중간는"을 eyeballed하고, 말 수
그녀는 컴퓨터 프로그램에 있다면 그녀는 모를 걸
그녀가 가진 유일한 것은 시나리오의 시작에 래치하기 때문이다
첫 번째 포인터이었다 루카스,이었다.
그녀는 반드시 해당 링크를 따라해야
그녀는 대략 중간을 발견 할 때까지 그녀의 방법을 계산하면,
심지어 다음, 그녀는 중간에 도달하면 금방 알 수 없을거야
그녀는 얼마나 많이 알아 끝으로 모든 길을 가겠하지 않는
당신이 가지고하지 않는 한 다음 backtracks, 그건 너무 어려운 일이 될 거에요
일종의 이중 연결 목록입니다.
>> 오늘 몇 가지 문제를 해결하지만, 다른 사람을 소개합니다.
다른 데이터 구조 모두에 대해 무엇입니까?
이것은 메이 하우스에서 트레이의 사진입니다
이 경우에, 우리는 또한 종류의 이미 얘기 한 데이터 구조를 갖추고 있습니다.
우리는 메모리의 맥락에서 스택에 대해 얘기
그는 종류의 의도적으로 물건을 때문에 메모리의 측면에서 스택
효과적으로 상단에 층을 더 많은 물건을 가진 데이터 구조입니다.
그러나 스택에 대한 흥미로운 점은 같은, 실제로는 경우가 있습니다
이 데이터 구조의 특별한 친절 있다는 것입니다.
이 데이터 구조입니다 상기의 첫 번째 요소
마지막 요소가 부족합니다.
당신은 스택에 넣어 할 첫 번째 줄의 경우
당신은 불행히도 스택 해제 할 마지막 줄이 될거야
그건 좋은 일에 쓰일 것 없어.
반대로, 당신은 다른 방법으로 주위에 생각 할 수 있습니다
의 마지막은 첫 번째가 부족합니다.
>> 이제 모든 시나리오는 스택을 갖는 곳 신경 오는거야
해당 속성이 데이터 구조
먼저 알아,의 마지막으로, 실제로 뛰어난입니까?
그건 좋은 일이야? 하는 건 나쁜 짓이야?
트레이는 모든 동일하지 않는다면 분명히 나쁜 일이야
그리고 그들은 모두 특별한 다른 색상이나 이것 저것있었습니다
당신이 원하는 색상은 아래의 모든 방법입니다.
물론, 큰 노력 없이는 얻을 수 없습니다.
당신은 상단에서 시작하여 내려 오면서해야합니다.
마찬가지로,이 팬 선수 중 한 일인가
누구가 아이폰과 선을 얻으려고 밤을 기다립니다
이런 곳에서?
는 것도 좋지 않을까 경우 애플 스토어
스택 데이터 구조였다?
야호? 정말?
그것은 마지막 순간에 표시하는 사람들 만 좋아
다음 대기열을 뜯어 낸하게.
그리고 사실, 너무 경사되었다는 사실은 큐를 말을하고
우리는 이러한 종류의 데이터 구조의 부를 것이다 것과 실제로 일치
순서 상관있어 현실에,
당신은 최초의 하나가 먼저 아웃되고 싶어
인간의 공정성을 위해서 만합니다.
우리는 일반적으로 큐 데이터 구조는 전화드립니다.
>> 이 연결리스트 외에, 우리가이 같은 기본적인 아이디어를 사용할 수 있습니다 밝혀
및 문제에 대한 해결책의 새로운 및 다른 유형을 만들기 시작합니다.
예를 들어, 스택의 경우, 우리는 스택을 나타냅니다
이와 같은 데이터 구조를 사용하여, 나는 제안합니다.
이 경우, 내가 구조체를 선언 한 결과,이 구조의 내부에 말했듯이
숫자의 배열 후라는 변수 크기입니다
나는이 일을 스택에게 전화 하겠어.
자,이 사실은 작동 왜?
스택의 경우, 나는 배열로 화면에이 효과적으로 그려 수 있습니다.
여기 내 스택입니다. 저건 내 번호입니다.
그리고 우리는,이,이,이로이 일을 그려 줄께요.
그리고 내가 여기 다른 데이터 멤버가
크기라고하는, 그래서이 크기이며,이 숫자로
그리고 집합 적으로, 여기 온 아이 패드 하나의 스택 구조를 나타냅니다.
이제 기본적으로 크기는 아마 0으로 초기화되어야한다는 거죠
그리고 처음 숫자의 배열의 내부이야
처음 배열을 할당 할 때?
쓰레기. 누가 알 겠어? 그리고 실제로 중요하지 않습니다.
그것은 완전히 무작위로,이 1, 2, 3, 4, 5 인 경우 중요하지 않습니다
내 구조에 저장 운이 너무 오래 알고 있기 때문에 그 스택의 크기
0, 그럼 프로그래밍다시피, 배열의 요소의 보지 않습니다.
거기 뭐가 중요하지 않습니다.
0 크기의 의미가 될 것 같은 사람들 보지 마.
>> 하지만 가서 스택에 무언가를 삽입하고 싶.
, 전 5 번을 삽입 할, 그래서 제가 여기 5 번을 넣어
그럼 내가 여기서 무슨 일을 내려 놓고 어떻게해야합니까?
지금은 실제로 크기에 1을 내려 놓고 것이다
지금 스택의 크기는 1입니다.
제가 가서 번호를 삽입하면, 무슨합시다 7 옆에 말을?
이것은 다음 2로 업데이트됩니다, 그리고 우리는 9 할거야
그리고 다음이 3으로 업데이트됩니다.
그러나 스택의 현재 흥미로운 기능입니다
난 내가 나타하려면 어떤 요소를 제거해야 해요
스택의 일에서, 그래서 얘기하는 거요?
9가는 제일 먼저 것입니다.
나는 스택에서 요소를 나타하려면 어떻게 사진 변경해야합니다
많은 메이의 트레이를 좋아하세요?
그래. 2 >> [학생] 세트 크기입니다.
맞아요, 제가 모두 2로 크기를 설정하고 있으며, 그 배열을 어떻게해야 하죠?
전 아무것도 할 필요가 없습니다.
내 말은, 그저 항문을 위해이 0 또는 -1 또는 의미 뭔가를 넣어 수
이 합법적 값이지만, 그건 문제가되지 않습니다 때문에
나는 얼마나 오래 배열 자체의 외부에 기록 할 수 있습니다
그래서 알고 만이 배열의 첫 번째 두 요소보세요.
자, 내가 가서이 배열에 숫자 8을 추가하면 어떻게 그림 다음 변경합니까?
이 8되고,이 3이됩니다.
여기 몇 모서리를 절단거야.
이제 우리는 5, 7, 8을 가지고 우리는 다시 3의 크기로하고 있습니다.
이것은 구현하기 아주 간단합니다
하지만 때 우리는이 디자인 결정을 후회하는거야?
언제 일이 매우 잘못 시작합니까? 그래.
[안 들리게 학생 응답]
다시 가서 집어 넣는 첫 번째 요소를 할 때
>> 스택은 후드 아래에 배열하더라도 그것은 여기 변
우리가 얘기를 시작했습니다 이러한 데이터 구조는 일반적으로 알려져 있습니다
추상 데이터 구조된다들이 구현하는 방법을
완전히 중요한 게 있습니다.
스택 같은 데이터 구조를 지원을 추가하도록되어
스택에 트레이를 밀어 푸시 같은 운영,
그리고 스택에서 요소를 제거하고, 그거야 팝업.
당신은 이미 구현 다른 사람의 코드를 다운로드 할 경우
이 일이 스택을 호출, 그 사람이 쓴 것
당신을위한 두 기능은 푸시와 그의 목적 삶의 팝업,
정확히 그런 짓을하는 것이다.
귀하 또는 그 사람 자신이 그 프로그램을 구현 자
구현하는 방법을 결정하는 완전히 하나였습니다 것이다
후드 아래에 밀어과 터지는의 의미
또는 밀 터지는의 기능.
그리고 여기에 약간 멍청한 결정을 한
이 간단한 데이터 구조 이유를 내 스택을 구현하여?
때이 데이터 구조 휴식을합니까?
어는 시점에서 사용자가 푸시 호출하면 예를 들어, 오류를 반환해야합니까?
[학생] 더 이상 공간이없는 경우.
맞아요, 더 이상 공간, 제가 용량을 초과 한 경우, 만약이
하지만 그 위험이 글로벌 상수 어떤 종류의 것을 제안 때문에 이는 모두 대문자입니다.
음, 그럼 난 그냥 미안 해요, 다른 가치를 강요 할 수 "라고해야 겠어요
스택에 "더 메이처럼.
>> 어떤 시점에서, 사람들은 그 작은 캐비닛의 상단 부분을 공격 할거야.
스택에 더 이상의 공간이나 용량이 오류가 어떤 종류가있는 시점에서 없습니다.
그들은 트레이 다른 곳, 다른 곳에서 요소를 넣어해야
또는 아무데도 전혀 요.
이제 큐와 함께, 우리는 그것을 다르게 약간을 구현 수 있습니다.
대기열이 후드 아래에, 그것은 구현 될 수 있다는 점에서 약간 다릅니다
배열로, 왜,이 케이스는, 내가 제안 무엇입니까
또한 목록의 머리를 대표하는 헤드 요소를 가지고하는 것은,
크기뿐만 아니라 목록의 앞에 애플 스토어에서 줄의 처음?
내가 왜 여기 데이터의 추가 조각을해야합니까?
무엇 숫자로 생각
제가 그려 한 경우는 다음과 같습니다.
이 지금 대신 스택의 큐입니다 가정
되는 - 그냥 애플 스토어 - 큐 같은 차이는 공정입니다.
목록의 시작 부분에 라인의 첫 번째 사람,이 경우 5 번,
그 또는 그녀가 먼저 가게에 알려 할 것이다.
가 그런 짓을 보자.
이 애플 스토어 지금이 순간에 내 큐의 상태이며, 있다고 가정합시다
열리고 처음, 숫자 5, 가게에 주도되어 있습니다.
어떻게 내가 처음으로 사람을 해제 대기 한 지금 그림을 변경하려면 어떻게해야합니까
줄의 앞에?
그게 뭐지? >> [학생] 대기열을 변경합니다.
머리를 변경, 그래서 5 사라집니다.
현실에서는이 작업을 수행하는 것처럼 - 최선의 방법이야?
이 사람이 사라 것처럼 현실에서, 그건.
숫자 7은 실제 매장에 어떤 거죠?
그들은 앞으로 큰 단계를 걸립니다.
>> 이 배열 할 때,하지만 우리는 감사 온거야
주위에 물건을 이동?
그게 당신의 시간 낭비의 일종 이죠?
첫 번째 사람을 가지고 같이 왜 이렇게 항문해야하지
메모리의 청크의 물리적 시작시 줄의 시작 부분에?
그래서 완전히 불필요한입니다. 이유는 무엇입니까?
난 그냥 대신 무엇을 기억하세요? >> [안 들리게 학생 응답]
맞아, 난 그냥이 추가 데이터 구성원 머리 기억
이제 목록의 머리는 잠시 전이었고 이는 더 이상 0하지 않을 수 있습니다.
이제 실제로 숫자 1입니다. 이런 식으로, 내가 약간의 최적화를.
나는 애플 스토어에서 줄의 시작 줄에서 사람을 해제 대기 한해서
모두가 선형 동작입니다 리콜, 이동하는 것은 아닙니다.
내가 대신 일정한 시간 만 투자 할 수
그리고 훨씬 빠른 응답을 얻을 수 있습니다.
하지만 돈을 지불 가격은 추가 성능을 얻기 위해 무엇
모두를 변화 할 필요가 안돼?
네. >> [안 들리게 학생 응답]
더 많은 사람들을 추가 할 수 있습니다, 그게 문제가 직교입니다
우리가 주변 사람들을 변화가 아니라는 사실합니다.
우리가 모든 사람을 이동 싫든 여부 그래, 아직도 배열
오, 난 괜찮아, 자네 말이 무슨 뜻인지를 참조하십시오.
사실, 난 당신이 거의하지만 그건에 말에 동의 해
우리는 이제 더 이상이 배열의 시작을 사용 할 수 없어
I 5를 제거하는 경우 때문에, 그럼 7을 제거합니다.
하지만은 오른쪽에있는 사람을 넣어.
>> 전 공간을 낭비하는 거 느낌, 결국 제 큐 전혀 아무것도로 분해
그래서 우리는 그냥 사람들이 빙 둘러을 가질 수
우리는, 원형 구조의 일종의 정말이 배열을 생각할 수
우리는 빙 둘러의 정렬을 수행하는 C에서 뭘 연산자를 사용할 수 있습니까?
[안 들리게 학생 응답] >> 모듈로 연산자.
그것은 당신이 빙 둘러 어떻게해야합니까을 통해 생각 좀 성가신 것
하지만, 우리가 할 수있는, 우리는 그 줄의 앞으로 사용하는 일에 사람들을 묻어 버릴 수 있겠구나 싶었는데 ...
하지만 우리는 그 줄의 실제 머리는 실제로이 머리 변수와 함께 기억 해요.
뭐,하지만 우리의 목표 궁극적으로 대신하는 경우
우리는 아니타와 무대에서 여기처럼, 숫자를 찾아하는 것이 었습니다
그런데 우리는 모든 세계의 가장까요?
우리는 배열에서 허용하는 것보다 더 정교을 원
우리가 동적으로 데이터 구조를 확장 할 수있는 기능을 원하기 때문에.
하지만 우리는 우리가 지적하는 것을에 의존해야하고 싶지 않아
첫 번째 강의에서, 최적의 알고리즘 아니었다
선형 검색의.
그것은 당신이 실제로 달성 할 수 있다는 판명
적어도 일정한 시간 가까이된다 아니타 같은 사람,
그녀가 데이터 구조를 구성하는 경우 연결 목록이되어서는 안된다,
스택이되지, 대기열이되지 않게, 수 사실,
그녀는 일을 찾아 할 수있는 데이터 구조 마련
하는 단어뿐 아니라 숫자, 왜에서 우리는 일정한 시간을 전화 할게.
>> 그리고 사실, 앞서 찾고,이 클래스의 psets 중 하나는 거의 항상
맞춤법 검사기의 구현으로서,
우리는 다시 몇 가지 150000 영어 단어 당신을주고 목표에 있습니다
메모리에 사람들을로드하고 빠르게 양식의 질문에 답변 할 수
이 단어가 올바르게 입력 했습니까?
그 대답을 모두 150,000 단어를 반복한다면 그리고 정말 싫어.
그러나, 사실, 우리는 매우 빠른 시간에 할 수있는 볼 수 있습니다.
그리고 해시 테이블이라는 구현 무언가를, 참여거야
그리고 한눈에 해시 테이블이라는 것은가는 경우에도
이 슈퍼 빠른 응답 시간 우리가 달성 해,
그 문제가 실​​제로 있다는 것을 밝혀졌다.
가 - 다시 전화이 일을 구현하는 시간을 때, 나는 다시하고 있어요.
내가 여기있는 유일한 사람입니다.
그 때이 일을 구현하는 때, 해시 테이블이라고
우리는 결정을 내려야 할거야.
이런 일이 실제로 얼마나 큰해야하나요?
그리고 우리는이 해시 테이블에 삽입 번호를 시작할 때,
어떻게 이런 식으로 그들을 저장하는거야
우리가 그들을 다 떨어질 때 우리는 빨리 다시 꺼내 수?
하지만 우리는 머지 않아 볼 수 있습니다 그 질문에
모든 사람들의 생일 클래스에있을 때 매우 밀접한 관계가있는 것입니다.
그것은이 방에서, 우리는 몇 십 명을 가진 걸 밝혀
우리 둘은 같은 생일은 아마 매우 높은 가지고있는 확률은 너무.
만 40 우리이 방에가 일인가?
같은 생일을 가진 두 사람의 확률은 무엇입니까?
[학생] 50 % 이상.
네, 50 % 이상. 사실, 나는 차트를 가져 왔어.
밖 및집니다이 정말 빠져 있습니다 미리보기-
이 방에있는 우리의 유일한 58, 우리의 2의 확률이있을 경우
같은 생일을 갖는 것은, 거의 100 % 상당히 높은
그리고 수요일에 우리의 상처를 많이 일으킬거야.
>> 그 말과 함께, 여기서 휴정 보자. 우리는 수요일에 표시됩니다.
[박수]
[CS50.TV]