RB 트리를 완전히 이해하지 않아도 되나요? [닫은]


15

그래서 나는 Cormen에서 붉은 검은 나무를 배웠습니다. 일반적으로 의사 코드를 살펴 보지 않고 처음부터 다시 작성할 수있을 정도로 모든 알고리즘과 데이터 구조를 이해하고 싶습니다. 나는 알고리즘을 정말 좋아하기 때문에 알고리즘의 작동 방식을 배우고 일반적으로 한 줄씩 진행하고 코드를보고 어떤 일이 일어나고 있는지 이해하는지 확인하여 몇 가지 사례를 시도합니다.

무슨 일이 일어나고 있는지 이해하면 RB 나무에 많은 시간이 걸렸습니다. 이 책의 설명에도 불구하고 여전히 코드를 이해하기가 어렵다는 것을 알았습니다. 회전이 어떻게 / 왜 작동하는지 이해할 수 없다는 것은 말할 것도 없습니다. 나는 그것이 직관적이지 않다. 삽입에 대한 세 가지 (실제로 여섯) 다른 경우와 삭제에 대한 네 가지 경우를 의미합니까? 이것을 이해할 수 있습니까? 부정하지 않고이 코드를 다시 작성하는 것은 불가능합니다. 바이너리 트리가 될 때까지 나는 머릿속에서 물건을 구현할 수 있었고, 약간 조정하면 항상 작동하지만 RB 트리는 시도조차하지 않습니다. 선생님도 가끔 혼란스러워서 그렇게 쉽지 않다고 생각하지만 동시에 일어나는 모든 일을 이해하지 않아도됩니까? 그 책은 실제로 회전에 대한 아이디어를 누군가가 생각해 냈습니다. 누군가 2 회전으로 삽입 문제를 해결할 수 있음을 어떻게 알았습니까? 그 놀라운!

내 질문은, 실제로 RB 트리를 100 % 이해해야합니까? 완전히 이해하지 못하면 물건을 건너 뛰는 기분이 들었습니다. 미리 감사드립니다! (PS : RB-tree에는 태그가 없으며 실제로는 트리, 이진 트리에는 태그가 없으므로 알고리즘 만 넣습니다)


18
"젊은이, 수학에서는 사물을 이해하지 못합니다. 그냥 익숙해집니다."

2
@Clash 어떤 맥락에서? RB 트리가 전문적인 환경에서 어떻게 작동하는지 알아야 할 필요는 없다고 생각하지만 원하는 작업에 따라 달라질 수 있습니다. 나는 당신이 그들을 필요로 할 때까지 건너 뛰는 것이 좋다고 말하고 싶습니다.
Adam Lear

4
@Clash 그것은 당신이 외부 소스로부터 안내를받는 것을 구현하는 것이 "속임수"라고 크게 귀찮게합니다. 의사 코드는 이유가 있기 때문에 메모리에서 수행 할 필요가 없습니다. Winston에 전적으로 동의합니다. 메모리를 이해하고 아는 것은 상호 배타적 인 두 가지입니다. 암기! = 이해와 이해! = 암기.
doppelgreener

3
RB 트리에 대해 실제로 신경 쓰지 않아도 괜찮습니다. 필요할 때까지?
Steven A. Lowe

1
다른 모든 유형의 트리 구현보다 RB 트리를 사용해야 할 때를 이해하십시오. 그들이 해결하는 문제와 RB 트리를 선택하는 모든 이유를 알아야합니다. 그러나 시험을 수행하지 않아도 (시험 이외의) 구현해야하는 경우에는 찾아 볼 수 있습니다. 그렇다면 왜 메모리에서 어떻게해야하는지 아십니까?
Dawood는 Monica Monica를

답변:


13

당신은 "책을 보지 않고 코드를 작성할 수 있다는 것"과 "이해"라는 개념을 동일시하는 것 같습니다. 이것들은 두 가지입니다. 균형을 유지하기 위해 트리 노드 회전이 트리를 재정렬하는 방법을 볼 수 있다면 이해할 수 있습니다. 회전이 적용되는 모든 사례를 즉시 기억할 수 있다는 것이 중요하지 않습니다.

필자는 펜 / 종이 / 몇 시간을 가지고 놀았을 때 회전을 알아낼 수 있었다. 그러나 나는 생각없이 그것을 쓸 수 없었습니다. 실제로 그러한 알고리즘을 작성해야한다면 모든 세부 사항을 올바르게 알고 있는지 확인하려고합니다. 물론 거의 모든 상황에서 이미 작성된 코드를 사용합니다.

이 모든 것이 사용되는 곳은 알고리즘에 맞지 않는 상황을 겪을 때입니다. 자신 만의 트리 구현을 작성할 필요는 없습니다. 그러나 이중 연결 목록의 가계도를 평평하게 해야하는 자신을 찾을 수 있습니다. 이 경우 회전의 기본 개념을 이해하면 매우 도움이 될 수 있습니다.


2
"당신은 책을 보지 않고 코드를 작성할 수 있다는 것과"이해 "라는 개념을 동일시하는 것 같습니다. 이것들은 서로 다른 두 가지입니다. ' 어 ... 아니 이 글을 쓰고 있다면 1 년에서 2 년이 넘는 대학에서 수학을 공부하지 않았다는 의미 일 것입니다. 어떤 시점에서, "이해"수학 (튜링의 예의는 컴퓨팅과 동일)은 단지 "이해 한"것을 보여줄 수 있다는 것입니다. 해결 방법이나 ifs 또는 어쩌면 foo 또는 bar 또는 baz가 없습니다. 이 수준에서 수학 주장을 증명할 수 없으면 건배됩니다. (당신의 이름이 Fermat가 아닌 이상)
Denis de Bernardy

14
@Dennis, 전공에 평균 이상의 수학 과정을 갖춘 CS 석사 학위를 취득했습니다. 당신이 내 요점을 이해하지 못하는 것이 두렵습니다. 이해하는 것을 증명하거나 입증 할 수있는 것이 매우 중요합니다. 증거 나 방법의 세부 사항을 암기 할 수있는 것은 아닙니다. 코드를 작성할 수 있어야합니다. 그러나 MEMORY에서 코드를 작성할 수있는 요구 사항에 대한 사용을 보지 못했습니다.
Winston Ewert

2
IIRC, 일부 교과서에는 빨강-검정 트리 알고리즘에 중대한 실수가 있습니다.
Steve314

2
@ Steve314, 교과서 저자가되기 위해 RB를 이해할 필요조차 없습니다! ;)
Winston Ewert

윈스턴 감사합니다, 이것은 나를 안심시켜줍니다! 가까운 장래에 게시 할 수있는 코드로 이해하지 못하는 몇 가지 사항 만 있습니다. 그러나 누군가가 3/6 건의 삽입과 4/8 건의 삭제를 발견 한 이유 / 방법을 이해하지 못하는 것이 기쁘다.
Bernardo Pires

4

함수형 프로그래밍에 정통한 사용자라면 이러한 접근 방식이 더 좋습니다 (Okasaki 1999).

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

그렇지 않다면 적어도 첫 문장에서 마음을 빼십시오.

모두들 자신의 컴퓨터 과학 수업에서 균형 잡힌 이진 검색 트리에 대해 배우지 만, 실제로 그런 짐승을 구현 한다는 생각에 멍청한 사람들조차 떨립니다 .


하하 라이언! 그것은 나를 안심시켜줍니다! 고마워요! 오늘 나는 또한 RB-Trees에 대한 SO에 대한 질문이 거의 없다는 것을 알았습니다. 그래서 나는 그들이 정말로 까다 롭다고 생각합니다.
Bernardo Pires

2
CS 대학생을 제외하고는 프로그래밍 언어 당 약 한 번만 구현되는 것이라고 생각합니다. (또는 이하. Scheme에 가장 많이 사용되는 RB 코드는 OCaml의 RB 코드에서 포팅 된 것 같습니다.)
Ryan Culpepper

연결이 끊어졌습니다 ( 미러 1 , 미러 2) . 미래의 어느 시점에서 두 미러를 모두 사용할 수없는 경우에 대한 전체 인용 : Chris Okasaki, "기능적 설정에서 붉은 검은 나무", 기능 프로그래밍 저널, 9 (4), pp471-477, 1999 년 7 월.
Snowball

3

회전을 자세히 이해할 필요는 없습니다. 당신은 해야 RB 나무와 2-3-4 나무 (세지 참조) 사이의 관계를 이해한다. 2-3-4 나무로 생각할 때 그 미친 회전은 훨씬 더 의미가 있습니다. 교수가 RB 트리를 2-3-4 개의 나무에 대한 구현 세부 사항으로 가르치지 않았다면 2-3-4 개의 나무에서 무언가를 읽어야 할 것입니다. (Sedgewick의 치료는 꽤 좋으며 Wikipedia에는 ​​없습니다.)

더 일반적으로, 알고리즘이 작동하는 이유의 구현 세부 사항을 이해하는 것이 때로는 유용한 경우가 있습니다. 알고리즘이 작동하는 이유의 논리를 이해하는 것이 거의 항상 유용합니다. 더 많은 알고리즘을 이해하면 더 나은 기회를 얻을 수 있지만 알고리즘을 직접 만들 수있는 것은 일반적으로 필요하지 않습니다.


1

다음 주에 시험에 "RB Trees By Heart"가 필요한 경우, 총알을 물고 배워야합니다. 이 경우 학습 방법을 재고해야합니다. 아마도 RB Trees를 반 친구에게 설명하려고하면 외롭지 않은 코드 작성의 밤보다 더 도움이 될 것입니다.

휴가 후에 RB Trees가 다음 코스의 기초가된다면, 지금 기분을 상하게하지 말고 이번 학기 코스에 집중하십시오. 그러나 RB Trees에서 두 번째 시도를 준비 할 수있는 주제에 대해서는 눈을 떼지 마십시오.

솔직히 당신이 정말로 그들을 필요로하지 않을 것이라고 생각한다면 (참조, Anna Lear의 의견), 후회없이 작별 인사를하십시오. 중대한).


1

프로그래밍 성공의 열쇠는 절대 포기하지 않는 것입니다 .

오늘 내일 RB 나무는 다른 것이 될 것입니다. 더 큰 교훈은 포기하지 않습니다 .

저에게는 이것이 프로그래밍의 핵심 요소 중 하나이며 포기하지 않습니다 ...

나는 당신이 계속 노력하고 , 실패 할 때 다시 는 할 것을 제안합니다 .

"가져올 때까지 딸깍 소리가 날 때까지 실행될 때까지."

일단 산을 극복하면 하늘이 맑아지기 때문입니다. 당신의 마음은 이해력이 바뀌고, 당신은 (다음 산까지) 일시적으로 높아 집니다. 이 일시적인 상승은 세계의 모든 돈보다 가치가 있습니다.


고마워요, 이것은 정확히 나의 두려움이었습니다! 이걸 포기하면 다음에 무엇을 포기하지 못하게됩니까? 이것이 바로 삽입과 삭제를 이해하기 위해 거의 하루 종일 낭비한 이유입니다.
Bernardo Pires

그것은 결코 낭비가 아닙니다. 모든 땀과 눈물을 보충하는 것보다 높이를 "클릭"할 때 저를 믿으십시오.
Darknight

0

그것을 이해하는 가장 좋은 방법은 시도해 보는 것입니다 .

  • 3 회 또는 6 회 회전이 있습니다. 한 장의 종이를 가져 와서 하나씩 쓰십시오.
  • 일단 그것을 얻으면, 가서 Red Black Tree를 구현하십시오. 몇 가지를 살펴봐도 괜찮습니다.

우리가 대학에서했던 방식입니다. 그리고 검사를 위해 우리는 그 부분이 어떻게 작동했는지 설명해야했습니다.

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